赞
踩
开源的c语言编写,支持网络,基于内存亦可持久化的日志型、高性能的key-value数据库,并提供多种语言的apl,通常被称为数据结构服务器,因为值(value)可以是字符串,哈希,列表,集合和有序集合等类型
redis与其他key-value缓存产品的特点
互联网数据目前基本使用两种方式存储,关系数据库或者key value,但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台的关系,就是一个列表,如果用关系数据库存储就需要转换成一种多行记录的形式,这种形式存在很多冗余数据,每一行都需要存储一些重复的信息。如果用key value存储则修改和删除比较麻烦,需要讲所有数据读出再写入。
redis在内存中设计了各种数据类型,让业务能够高速原子的访问这些数据结构,并且不需要关心持久存储的问题,从架构解决了前面两种存储需要走一些弯路的问题。
AOF文件比RDB文件大,切恢复速度慢,这样导致违背高可用行性的本意。在redis中还有另一种方法来达到目的:replication。由于redis的高性能,复制基本没有延迟,这样达到了防止单点故障且实现了高可用。
redis支持五中数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
是redis最基本的数据类型,可以理解成与memcache一模一样的类型。一个key对应一个value。意思是redis的string可以包含任何数据,比如jpg图片或序列化对象。
一个键最大存储512MB
127.0.0.1:6379> set var 123 # set赋值
OK
127.0.0.1:6636> get var #get取值
"123"
是一个键值对集合,一个string类型的field和value的映射表。hash特别适合用于存储对象
127.0.0.1:6379> HSET set1 name "zhangsan" (integer) 1 127.0.0.1:6379> HSET set1 score "100" (integer) 1 127.0.0.1:6379> HSET set2 name "lisi" (integer) 1 127.0.0.1:6379> HSET set2 score "99" (integer) 1 127.0.0.1:6379> HGET set1 name "zhangsan" 127.0.0.1:6379> HGET set1 score "100" 127.0.0.1:6379> HGET set2 name "lisi" 127.0.0.1:6379> HGET set2 score "99"
127.0.0.1:6379> HMSET var:1 name zhangsan wanger lisi
OK
127.0.0.1:6379> HGETALL var:1
1) "name"
2) "zhangsan"
3) "wanger"
4) "lisi"
# 说明:var:1是键值,每个hash可以存储232-1键值对
hmset用于建立hash对象,hgetall用于获取hash对象
127.0.0.1:6379> hset test1 name1 zhangsan name2 wanger name3 lisi name4 mazi (integer) 4 127.0.0.1:6379> HMGET test2 name1 zhangsi name2 wangsan name3 liwu name4 mazi 1) (nil) 2) (nil) 3) (nil) 4) (nil) 5) (nil) 6) (nil) 7) (nil) 8) (nil) 127.0.0.1:6379> HGETALL test1 1) "name1" 2) "zhangsan" 3) "name2" 4) "wanger" 5) "name3" 6) "lisi" 7) "name4" 8) "mazi" 127.0.0.1:6379> HGETALL test2 (empty list or set) 127.0.0.1:6379> hget test1 name1 "zhangsan" 127.0.0.1:6379> hget test2 name1 (nil)
127.0.0.1:6379> lpush lvar 1
(integer) 1
127.0.0.1:6379> lpush lvar a
(integer) 2
127.0.0.1:6379> lpush lvar ab
(integer) 3
127.0.0.1:6379> lrange lvar 0 1
1) "ab"
2) "a"
127.0.0.1:6379> lrange lvar 0 10
1) "ab"
2) "a"
3) "1"
127.0.0.1:6379> lrange lvar 2 2
1) "1"
说明:lpush往列表的前面插入;lrange后面的数字是范围(闭区间)
列表最多可存储232-1元素(4294967295,每个列表可存储40多亿)
redis的set是string类型的无序集合。
集合是通过哈希表实现的,
127.0.0.1:6379> sadd setvar redis
(integer) 1
127.0.0.1:6379> sadd setvar kongkong
(integer) 1
127.0.0.1:6379> sadd setvar kongkong
(integer) 0
127.0.0.1:6379> sadd setvar kongkongruye
(integer) 1
127.0.0.1:6379> SMEMBERS setvar
1) "kongkong"
2) "redis"
3) "kongkongruye"
说明:set往集合中插入元素,smembers列举出集合中的元素
成功插入返回1;错误插入返回0
zset和set一样也是string类型的集合,且不允许有重复的元素;不同指出在于zset关联一个double类型的分数,redis通过分数在对集合中的元素排序;zset的元素是唯一的,但分数可以是重复的
127.0.0.1:6379> ZADD zvar 1 redis (integer) 1 127.0.0.1:6379> ZADD zvar 1 kongkong (integer) 1 127.0.0.1:6379> ZADD zvar 1 kongkong (integer) 0 127.0.0.1:6379> ZADD zvar 1 kongkongruye (integer) 1 127.0.0.1:6379> ZRANGEBYSCORE zvar 0 2 1) "kongkong" 2) "kongkongruye" 3) "redis" 127.0.0.1:6379> ZRANGEBYSCORE zvar 0 4 1) "kongkong" 2) "kongkongruye" 3) "redis" 127.0.0.1:6379> ZRANGEBYSCORE zvar -3 (error) ERR wrong number of arguments for 'zrangebyscore' command 127.0.0.1:6379> ZRANGEBYSCORE zvar -3 10 1) "kongkong" 2) "kongkongruye" 3) "redis" 127.0.0.1:6379> ZRANGEBYSCORE zvar -3 1 1) "kongkong" 2) "kongkongruye" 3) "redis" 127.0.0.1:6379> ZRANGEBYSCORE zvar -1 0 (empty list or set) 分数为float(可正,负,0)
说明:成功插入返回1,否则返回0
快照是默认的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式,可以配置redis在n秒内如果超过m个key被修改就自动做快照。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
client也可以用save或者bgsave命令通知redis做一次快照持久化,save操作是在主线程中保存快照的。由于redis使用一个主线程来处理所有client的请求,这种方式会阻塞所有的client请求,所以不推荐使用,另一点需要注意的事,每次快照持久化都是将内存数据完全写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能
另外由于快照方式是一定时间间隔做一次的,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改,如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。
使用aof持久化方式时,redis会将每一个收到的写命令通过write函数追加到文件中(默认时appendonly.aof)。当redis重启时会通过重新执行文件中的保存的写命令来在内存中重建整个数据库的内容。由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样的aof方式的持久化也有可能会丢失部分修改。可以通过修改配置文件告诉redis,我们想要通过fsync函数强制os写入到磁盘的时机。有三种方式
appendonly yes #启用aof持久化方式
# appendfsync always # 每次收到写命令就立即强制写入磁盘,速度最慢,但是保证了完全的持久哈,不推荐使用
appendfsync eversec #每秒强制写入磁盘一次,在性能和持久化方面做了很好的折中。推荐
# appendfsync no # 完全依赖os,性能最好,持久化没保证
aof的方式同时带来了另一个问题,持久化文件会变的越来越大。例如:调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为恢复数据库的状态只需要保存一条set test100 就够了。为了压缩aof的持久化文件,redis提供了bgrewriteaof命令,接收到此命令。redis将使用与快照类似的方式将内存的数据以命令的方式保存在临时文件中,最后替换原来的文件。如下
需要注意的时重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
RDB方式 | AOF方式 | |
---|---|---|
描述 | 默认方式,实现方式是定时将内存的快照持久化到硬盘 | aof即append only file,再写入内存数据的同时将操作命令保存到日志文件中 |
优点 | 使用单独的子进程进行持久化,主进程不会进行任何的io操作,保证redis的高性能 | 保证了数据的可靠性及高安全性,保证更高的数据完整性 |
缺点 | RDB是件个月i段时间进行持久化,如果持久化之间redis发生故障,数据会丢失 | 在并发更改上万的系统上。命令日志是一个分场庞大的数据,管理维护成本非常高,回复创建时间会非常长;AOF文件比RDB文件大,且恢复速度慢 |
应用场景 | 更适合数据要求不严谨的时候 | 适合数据完整性要求高的场景 |
[root@redis1 ~]# yum install gcc gcc-c++ make
[root@redis1 ~]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
[root@redis1 ~]# tar xf redis-5.0.4.tar.gz -C /usr/local/src/
[root@redis1 ~]# cd /usr/local/
[root@redis1 local]# ln -s /usr/local/src/redis-5.0.4 ./redis
[root@redis1 redis]# cd redis/
[root@redis1 redis]# make
[root@redis1 redis]# echo $?
0
[root@redis1 redis]# mkdir -p /data/redis
[root@redis1 redis]# make PREFIX=/data/redis install
[root@redis1 redis]# echo $?
0
[root@redis1 redis]# mkdir /data/redis/conf
[root@redis1 redis]# cp -p redis.conf /data/redis/conf/
[root@redis1 ~]# cd /data/redis/bin/
[ro
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。