• binary-safe strings
  • Lists: 用linked lists 实现的
  • Sets
  • Sorted Sets: 用score 排序
  • Hashes: 对象存储
  • BitMaps
  • HyperLogLogs: 做基础统计用

Keys

  • 可以用任意 binary sequence 作为key ,String 图片 或者对象 都可以 null也可以
  • 最大长度512M
  • 长度最好不要太长也不要太短, 太短很难理解,太长会增加匹配字符串的消耗,进而影响效率

Strings

> set mykey somevalue
OK
> get mykey
"somevalue"
  • value 可以为任意形式的String包括binary。value可以大于512M
  • 再次调用同一个key的set 会覆盖前面的值
  • Set命令 可以设置过期时间和对是否存在做区分设置
EX seconds -- 过期时间  秒
PX milliseconds -- 过期时间毫秒
NX -- 仅key不存在时设置
XX -- 仅key存才时设置
  • 当value时数字时,可以用INCR, INCRBY, DECR and DECRBY对value进行原子性操作

一些有用的key命令

exists somekey //判断是否存在
del somekey //删除key并且释放value空间
type somekey //返回value数据类型

Redis 过期时间

expire somekey seconds //设置过期时间
ttl somekey //返回剩余时间

Lists

  • 用linkedList实现,因此满足很多linkedlist的特性。能快速插入头尾的新值,但是访问中间的值却效率比较低。如果较多需要访问中间位置的值 ,可以用SortedSets 模拟实现
lpush mylist 1 // 左边添加一个元素
rpush mylist 2 // 右边添加一个元素
lrange mylist 0 -1 // 获取全部元素
lrange mylist -2 -1 // 获取倒数第一个元素 和倒数第二个元素
rpush mylist 1 2 3 4 5 "foo bar" //添加多个元素
rpop mylist //
lpop mylist //
  • 应用场景:缓存社交媒体的最新更新
  • 应用场景: 实现 生产者-消费者 模式。 用lpush 存储任务 然后用rpop消费任务
  • 用 lpush 和 ltrim 联合使用实现 保持最新的定长list
> brpop tasks 5
1) "tasks"
2) "do_something"
  • brpop blpop 阻塞式pop
  • Automatic creation and removal of keys: 当list中元素没有时,key会被删除,当重新插入时,会即时创建新list
> lpush mylist 1 2 3
(integer) 3
> exists mylist
(integer) 1
> lpop mylist
"3"
> lpop mylist
"2"
> lpop mylist
"1"
> exists mylist
(integer) 0

Hashes

  • 作为Object来用
> 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"

> hmget user:1000 username birthyear no-such-field
1) "antirez"
2) "1977"
3) (nil)

> hincrby user:1000 birthyear 10
(integer) 1987
> hincrby user:1000 birthyear 10
(integer) 1997

Sets

  • 无序,排他的 集合。跟java中的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

Sorted Sets

  • mix between a Set and a Hash
  • key 是唯一并且无序的。有一个float的score做排序
  • 比较规则。如果A.score > B.score 则 A > B. 如果A.score == B.score 并且 A 的字母顺序( lexicographically) 大于B 则 A大于B
  • 底层实现: implemented via a dual-ported data structure containing both a skip list and a hash table。
  • 插入复杂组 O(logn) ,查询复杂度 O(1)
> zadd hackers 1940 "Alan Kay"

> zrange hackers 0 -1

> zrevrange hackers 0 -1

> zrange hackers 0 -1 withscores

> zrangebyscore hackers -inf 1950 //取得分值段内的数据

> zremrangebyscore hackers 1940 1960 //删除分值段内的数据

> zrank hackers "Anita Borg"