redis目前提供五种数据类型
string是最简单的类型,你可以理解成与Memcached一样的类型,一个key对应一个value,
其上支持的操作与Memcached的操作类似。但它的功能更丰富。
示例:
# redis-cli set key1 "asdf"
OK
# redis-cli get key1
"asdf"
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一
个应用就是消息队列,可以利用 List 的 *PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作
将任务取出进行执行。Redis 还提供了操作 List 中某一段元素的 API,你可以直接查询,删除 List 中某
一段的元素。
示例:
左右插入 左查最右 又插最左
[root@172-7-15-101 ~]# redis-cli lpush mylist "aaaa bbb."
(integer) 1
[root@172-7-15-101 ~]# redis-cli lpush mylist "123."
(integer) 2
[root@172-7-15-101 ~]# redis-cli lpush mylist "aaa."
(integer) 3
右侧插入rpush 左侧插入lpush
右侧去取rpop 左侧去取lpop mylist
rpop mylist
aaaa bbb.
看所有的队列
lrange mylist 0 -1
最左侧的第一个 最右侧的第一个
[root@172-7-15-101 ~]# redis-cli lrange mylist 0 2
1) "aaaa bbb."
2) "1 2 3."
3) "aaa."
[root@172-7-15-101 ~]# redis-cli lrange mylist 0 1
1) "aaaa bbb."
2) "1 2 3."
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。
操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所
有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常
方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择
将结果返回给客户端还是存集到一个新的集合中。
[root@172-7-15-101 ~]# redis-cli sadd myset a
(integer) 1
[root@172-7-15-101 ~]# redis-cli sadd myset b
(integer) 1
[root@172-7-15-101 ~]# redis-cli sadd myset d
(integer) 1
[root@172-7-15-101 ~]# redis-cli smembers myset
1) "b"
2) "d"
3) "a"
sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,
比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试
得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,
比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。
让重要的任务优先执行。
[root@172-7-15-101 ~]# redis-cli zadd myset2 2 "abc"
(integer) 1
[root@172-7-15-101 ~]# redis-cli zadd myset2 23 "cde 123"
(integer) 1
[root@172-7-15-101 ~]# redis-cli zadd myset2 22 "123-aaa"
(integer) 1
[root@172-7-15-101 ~]# redis-cli zadd myset2 34 "a123a"
(integer) 1
[root@172-7-15-101 ~]# redis-cli zrange myset2 0 -1
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"
倒序
[root@172-7-15-101 ~]# redis-cli zrevrange myset2 0 -1
1) "123-aaa"
2) "abc"
3) "a123a"
4) "cde 123"
Hash数据类型,在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为
一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,
通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。
简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作
都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。
127.0.0.1:6379> hset hash2 name aaa
(integer) 1
127.0.0.1:6379> hset hash2 age 10
(integer) 1
127.0.0.1:6379> hset hash2 sex nan
(integer) 1
127.0.0.1:6379> hgetall hash2
"name"
"aaa"
"age"
"10"
"sex"
"nan"
127.0.0.1:6379> hgetall hash2 age
"10"
存储结构和存储格式
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,
比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时
间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更
新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。