Redis必知必会

什么是Redis

Redis是一个开源、基于内存的键值对存储数据库。通常情况下,键的类型都是字符串,值的类型有多种,Redis支持值的数据结构如下:

  1. 字符串
  2. 散列
  3. 列表
  4. 集合
  5. 有序集合
  6. 位图

Redis键和常见的值类型

键类型(key) 特点 备注
二进制安全 任何二进制序列作为键
较短的键占用内存较少
非常短的键,不利于语义化 需要在键的可读性和更少的内存消耗,找到合适平衡点。
尝试坚持使用固定的模式 例如,object-type:id => user:1000
键最大为512MB
Strings SET/GET 设置和获取字符串值 与Redis键关联最简单的值类型
支持包括二进制数据的字符串,最大512MB
SET nx 如果key不存在就设置值
SET xx 如果key存在才更新值
SET ex 设置指定的过期时间,多少秒
SET px 设置指定过期时间,多少毫秒
INCR key 解析字符串作为整数,自增1,得到的值作为新的值
EXISTS key 检查当前数据库是否存在给定的键
DEL key 删除键和关联的值
TTL key 检查键的剩余生存时间
列表(List) 通过链表实现 在常量时间内添加新元素到头部或者尾部,访问元素所需时间跟元素的索引成正比
LPUSH key value 将新元素添加到列表左侧,也就是头部
RPUSH key value 将新元素添加到列表右侧,也就是尾部
LRANGE key 0 size-1 从列表获取指定范围的元素,可以为负数。-1是最后一个元素,-2列表倒数第2个元素
RPOP key 从列表查找元素并同时从列表尾部弹出元素
LPOP key 从列表查找元素并同时从列表头部弹出元素
LTRIM key 0 2 只保存最新的N个元素,并丢弃所有最旧的元素
BRPOP key 阻塞版本的RPOP,等待指定列表的元素到达,若超时就立即返回。
BLPOP key 阻塞版本的LPOP,等待指定列表的元素到达,若超时就立即返回。
客户端以有序方式获取元素,返回值为2个元素的数组,超时则返回NULL
hash(哈希) hmset key k1 v1 k2 v2 设置哈希键多个字段值
hget key k1 获取散列中的指定字段
hget key k2
hmget key k1 k2 返回散列表中的多个字段值
hincrby key k1 value 对散列表中的指定字段自增值
集合(Set) 该集合是无序的
sadd myset 1 2 3 给指定集合添加多个元素
smembers myset 返回指定集合的元素
sismember myset 3 检查集合中元素是否存在
sinter k1 k2 k3 执行多个键间的交集
spop key 随机删除一个集合中的元素
sunionstore k1 k2 获取多个集合对应的并集,存储到第一个集合中。
scard key 获取指定集合的元素个数
有序集合(Sort Set) zadd key score value 添加有序集合的分数和值
内部实现是采用跳表+散列表实现。
zrang key 0 -1 返回指定有序集合全部元素,默认为升序
zrevrangekey 0 -1 倒序返回元素
zrangebyscore key -inf 1950 获取指定的排序之后的元素
zremrangebyscore key 1940 1960 删除指定范围内的元素
zrank key value 查询值所在的位置
位图(bit) SETBIT key 10 1 设置指定位图值
GETBIT key 10 获取指定位图值
BITCOUNT key 计算设置为1位的计数

为什么要用Redis

  1. Redis的访问速度快,完全基于内存操作,网络层采用epoll单线程解决高并发的问题。
  2. Redis有着丰富的数据类型,常见有5种:string、Hash、List、Set、SortSet、Bit等。

怎么用Redis

Redis列表

列表对很多任务都有用,比如:

  1. 记住用户发布到社交网络的最新更新。
  2. 流程之间的通信。
  3. 使用生产者将消息推入列表的消费者-生产者模式。

Redis集合

标记新闻文章的标签。假设文章id为1000,有标签1,2,5,77,那么你可以设计:

sadd news:1000:tags 1 2 55 77

也许你想要反向关系,标签对应的文章列表

sadd tag:1:news 1000
sadd tag:2:news 1000
sadd tag:5:news 1000
sadd tag:77:news 1000

smembers news:1000:tags

为了模拟基于网络的扑克游戏,你可以使用(C)lubs(黑梅花),(D)iamonds(红方块),(H)earts(红心),(S)pades(黑桃) 标识牌面的不同花色:

sadd deck C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 CJ CQ CK
   D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 DJ DQ DK H1 H2 H3
   H4 H5 H6 H7 H8 H9 H10 HJ HQ HK S1 S2 S3 S4 S5 S6
   S7 S8 S9 S10 SJ SQ SK

Redis位图

实现一个用户每日访问的最长连续性。位索引为,获取当前的unix时间戳,减去初始偏移量,然后除以3600*24。对于每一个用户都有一个包含每天访问信息的小字符串。使用BITCOUNT获取给定用户访问网站的天数,BITPOS调用,计算出最长的天数。

假设网站公开的日期为20190502,转化为时间戳为1556726400,那么位索引的计算公式为=(当前00:00:00的时间戳-1556726400)/(3600*24)取整,那么20190502的索引为0,20190503的索引,那么刚好=1。通过BITCOUNT可以计算出用户在指定期间访问网站的天数。

参考链接

  1. 介绍Redis数据类型和抽象
  2. 数据类型
  3. 为什么要用Redis