一, 数据类型
redis 的数据结构是 key-value 的键值对的形式, 但是它和传统 String-String 的键值对形式不一样, 它的 value 不仅仅是 string 类型, 而是有着丰富的数据类型, 如:
1)string -> 二进制安全的, 处理任何字符串, 包括空字符串
2)list -> 有序链表结构的字符串集合
3)sets -> 无序, 值不重复的字符串集合
4)sorted sets -> 有序的 sets 字符串集合
5)hashes -> 存储键值为字符串的 map
6)bit arrays -> 参数值为 1 或 0, 主要用于存储 boolean 类型的实时数据
7)hyperLogLogs -> 主要用于大元素的统计
下面会详细讲解各种类型
二, redis 的 keys
redis 的 key 是二进制安全的字符串, 你可以使用简单的 "foo" 字符串作为 key, 也可以使用 JPED file 的图片文件字符串序列作为 key, 甚至于一个空的字符串也是一个有效的 key.
关于 redis 的 key 有一下几个原则:
1) 不应使用过长的 key: 过长的 key 会提高查询成本, 如果 key 不得不使用大的字符串值, 可以哈希化.
2) 不应使用过短的 key: 过短的 key 通常可读性非常差, 如: u1000flw 和 user:1000:followers 明显后者的可读性较高.
3) 推荐使用一定格式的 key: 如: object-type:id 模式: user:1000.: 和 . 和 - 经常被用在 key 的表示中, 如: comment:1000:reply-to 或者 comment:1000:reply.to
4) key 的最大内存为 512mb
三, string 类型
string 类型是最简单的类型, 有很多的用途, 如: 可以用来缓存如 html 或者页面等数据.
简单的赋值和取值:
- > set mykey somevalue
- OK
- > get mykey
- "somevalue"
可以在赋值时设置参数, 如:
在空值的时候设置值, 否则失败
- > set mykey newval nx
- (nil)
在非空的时候设置值, 否则失败
- > set mykey newval xx
- OK
可以做自增操作, 自减操作类似 (decr,decrby)
- > set counter 100
- OK
- > incr counter
- (integer) 101
- > incr counter
- (integer) 102
- > incrby counter 50
- (integer) 152
可以设置值并返回旧的值
- > getset mykey 100
- (nil)
可以同时设置多个值, 取多个值 (返回数组)
- > mset a 10 b 20 c 30
- OK
- > mget a b c
- 1) "10"
- 2) "20"
- 3) "30"
判断是否存在
- > set mykey hello
- OK
- > exists mykey
- (integer) 1
- > del mykey
- (integer) 1
- > exists mykey
- (integer) 0
判断类型
- > set mykey x
- OK
- > type mykey
- string
- > del mykey
- (integer) 1
- > type mykey
- none
设置过期时间
- > set key some-value
- OK
- > expire key 5
- (integer) 1
- > get key (immediately)
- "some-value"
- > get key (after some time)
- (nil)
查看剩余过期时间
- > set key 100 ex 10
- OK
- > ttl key
- (integer) 9
四, list
list 是一个链表结构的集合, 高效的新增操作, 但是查询操作效率不搞, 如果需要高效查询可以使用 sorted set.
list 经常用来存储最新的数据, 以及发布 / 订阅模式中使用
添加操作
- > rpush mylist A
- (integer) 1
- > rpush mylist B
- (integer) 2
- > lpush mylist first
- (integer) 3
查询操作 (0 表示索引 0, -1 表示倒数第一个)
- > lrange mylist 0 -1
- 1) "first"
- 2) "A"
- 3) "B"
可以一次添加多个值
- > rpush mylist 1 2 3 4 5 "foo bar"
- (integer) 9
- > lrange mylist 0 -1
- 1) "first"
- 2) "A"
- 3) "B"
- 4) "1"
- 5) "2"
- 6) "3"
- 7) "4"
- 8) "5"
- 9) "foo bar"
删除操作
- > rpush mylist a b c
- (integer) 3
- > rpop mylist
- "c"
- > rpop mylist
- "b"
- > rpop mylist
- "a"
可以截取
- > rpush mylist 1 2 3 4 5
- (integer) 5
- > ltrim mylist 0 2
- OK
- > lrange mylist 0 -1
- 1) "1"
- 2) "2"
- 3) "3"
支持阻塞 (例如: 如果没有值阻塞 5 秒钟以后执行)
- > brpop tasks 5
- 1) "tasks"
- 2) "do_something"
五, hashes
哈希结构存储的是 field-value 的结构, 你可以简单理解为 map, 如
设置和获取
- > hmset user:1000 username antirez birthyear 1977 verified 1
- OK
- > hget user:1000 username
- "antirez"
- > hget user:1000 birthyear
- "1977"
- > hgetall user:1000
- 1) "username"
- 2) "antirez"
- 3) "birthyear"
- 4) "1977"
- 5) "verified"
- 6) "1"
自增
- > hincrby user:1000 birthyear 10
- (integer) 1987
- > hincrby user:1000 birthyear 10
- (integer) 1997
六, sets
sets 是一种无序的字符串集合, 可以方便地用于取交集, 并集
设置值查询值
- > sadd myset 1 2 3
- (integer) 3
- > smembers myset
- 1. 3
- 2. 1
- 3. 2
判断是否存在某个值
- > sismember myset 3
- (integer) 1
- > sismember myset 30
- (integer) 0
添加多个值
- > sadd news:1000:tags 1 2 5 77
- (integer) 4
取交集
> sinter set1 set2
取并集
> sunion set1 set2
取并集数量
> sunionstore set1 set2
查询数量
> scard set
七, sorted set
有序的 set, 和 set 不同的地方在于 sorted set 是可以根据给定的 score 排序的
添加
- > zadd hackers 1940 "Alan Kay"
- (integer) 1
- > zadd hackers 1957 "Sophie Wilson"
- (integer) 1
- > zadd hackers 1953 "Richard Stallman"
- (integer) 1
- > zadd hackers 1949 "Anita Borg"
- (integer) 1
- > zadd hackers 1965 "Yukihiro Matsumoto"
- (integer) 1
- > zadd hackers 1914 "Hedy Lamarr"
- (integer) 1
- > zadd hackers 1916 "Claude Shannon"
- (integer) 1
- > zadd hackers 1969 "Linus Torvalds"
- (integer) 1
- > zadd hackers 1912 "Alan Turing"
- (integer) 1
查询 (我们可以看到根据上面提供的 score 进行排序了)
- > zrange hackers 0 -1
- 1) "Alan Turing"
- 2) "Hedy Lamarr"
- 3) "Claude Shannon"
- 4) "Alan Kay"
- 5) "Anita Borg"
- 6) "Richard Stallman"
- 7) "Sophie Wilson"
- 8) "Yukihiro Matsumoto"
- 9) "Linus Torvalds"
反向排序
- > zrevrange hackers 0 -1
- 1) "Linus Torvalds"
- 2) "Yukihiro Matsumoto"
- 3) "Sophie Wilson"
- 4) "Richard Stallman"
- 5) "Anita Borg"
- 6) "Alan Kay"
- 7) "Claude Shannon"
- 8) "Hedy Lamarr"
- 9) "Alan Turing"
连同 score 一起查出来
- > zrange hackers 0 -1 withscores
- ) "Alan Turing"
- ) "1912"
- ) "Hedy Lamarr"
- ) "1914"
- ) "Claude Shannon"
- ) "1916"
- ) "Alan Kay"
- ) "1940"
- ) "Anita Borg"
- ) "1949"
- ) "Richard Stallman"
- ) "1953"
- ) "Sophie Wilson"
- ) "1957"
- ) "Yukihiro Matsumoto"
- ) "1965"
- ) "Linus Torvalds"
- ) "1969"
根据 score 上限查询
- > zrangebyscore hackers -inf 1950
- 1) "Alan Turing"
- 2) "Hedy Lamarr"
- 3) "Claude Shannon"
- 4) "Alan Kay"
- 5) "Anita Borg"
根据 score 范围查询
- > zremrangebyscore hackers 1940 1960
- (integer) 4
获取元素的索引值
- > zrank hackers "Anita Borg"
- (integer) 4
八, bitmaps
bitmaps 其实不属于一个实际的数据类型, 它是基于 string 类型的. 主要用于存储 boolean 类型的数据, 也就是说你只能设置值如 1 或者 0; 由于 string 的最大内存空间为 512mb, 所以 bitmaps 的最大值为 2^32bit 最大值.
添加
- > setbit key 10 1
- (integer) 1
- > getbit key 10
- (integer) 1
- > getbit key 11
- (integer) 0
统计
- > setbit key 0 1
- (integer) 0
- > setbit key 100 1
- (integer) 0
- > bitcount key
- (integer) 2
九, hyperloglogs
redis 在 2.8.9 版本中添加了 hyperloglog 结构, 该结构主要用于统计算法. 它不同于 list 存储元素本身, 而是根据输入元素来计算基数.
添加
- > pfadd hll a b c d
- (integer) 1
统计
- > pfcount hll
- (integer) 4
来源: http://www.bubuko.com/infodetail-2666223.html