Redis 初步探索

List

存储类型

存储有序的字符串(从左到右),元素可以重复,可以充当队列和栈的角色

操作命令
lpush  queue alpush  queue b crpush  queue d elpop   queueblpop queuebrpop queue

「取值」

lindex queue 0 lindex queue 0 -1
应用场景
  • 因为List 是有序的,可以用来做用户的时间线。
  • 消息队列
    List 提供了两个阻塞的弹出操作:BLOPO/BRPOP,可以设置超时时间
    BLPOP:BLPOP key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞队列直到等待超时或发现可弹出元素为止。
    BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    队列:先进先出:rpush blpop ,左头右尾,右边进行队列,左边出队列。
    栈:先进先出:rpush brpop

Set

「存储类型」

String 类型的无序集合,最大存储数量为 2^32-1

「操作命令」

sadd myset a b c d e f g
smembers myset
scard myset
srandmember key
spop myset
srem myset d e f
sismember myset a
应用场景
spop myset

例如:微博点赞:

微博id 为 w1001 ,用户的id为 u2001

用like:w1001来维护u2001 这条微博的所有点赞的用户

点赞了这表微博:sadd like:w1001 u2001

取消点赞:srem: like: w1001 u2001

是否点赞:sismember like:w1001 u2001

点赞的所有用户:smembers like:w1001

点赞数:scrad like:u2001

用tags:t3001 来维护商品所有的标签

sadd tags:t3001 物品便宜

sadd tags:t3001 质量好

sadd tags:t3001 物流超快

获取差集

sdiff set1 set2

获取交集

sinter set1 set2

获取并集

sunion set1 set2

例如:苹果手机上市

iPhone 上市了

sadd brand:apple iPhoneXX

sadd brand:  ios iPhoneXX

 sad screensize: 6.0-6,24 iPhoneXX

 sad screentype:lcd iPhoneXX

筛选商品:苹果的,IOS,屏幕在 6.0~6.24之间的,屏幕材质是lcd屏幕

sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd
  • 商品筛选
  • 商品标签
  • 点赞、签到、打卡
  • 随机获取元素
  • 查看元素是否存在
  • 移除一个或者多个元素
  • 随机弹出一个元素
  • 随机获取一个元素
  • 统计元素个数
  • 获取所有元素
  • 添加一个或者多个元素

ZSet

「存储类型」

sorteed set,有序的set,每个元素有个score

score 先相同时,按照key的ASCII码排序

数据结构对比:

数据结构

是否允许重复元素

是否有序

有序实现方式

列表list



索引下标

集合set




有序集合zset



分支score

「操作命令」

添加元素

zadd myset 10 java 20 php 30 python 40 go

获取全部元素

zrange myzset 0 -1 withscoreszrevrange myset 0 -1 withscores

根据分支区间获取元素

zrangebyscore myset 20 30

移除元素

也可以根据score rank 删除

zrem myzset php cpp

统计元素个数

zcard myzset

分值递增

zincrby myset 5 java

根据分支统计个数

zcount myset 20  60

获取元素rank

zrank myset java

获取元素 score

zscore myset java

也有倒序的rev 操作(reverse)

应用场景
  • 排行榜

id为 6001 的新闻点击数加1,:zincrby hotNews:20200701 1 n6001

获取今天点击最多的15条:zrevrange hotNews:   20200701 0 15 withscores

BitMaps

BitMaps 是在字符串类型上面定义的位操作,一个字节由8个二进制位组成。

set k1 a

获取value 在 offset 处的值(a 对应的ASCII码是97,转换为二进制数据是:01100001)

getbit k1 0

修改二进制数据(b 对应的ASCII码是98,转换为二进制数据为 01100010)

setbit k1 6 1setbit k1 7 0get k1

统计二进制位中1的个数

bitpos k1 1bitpos k1 0

BITOP 命令支持AND  \OR \NOT\XOR这四种操作中的任意一种参数:

BITOP AND destkey srckey1 ..... srckeyN,对一个或者多个key求逻辑与,并将结果保存到destkey

BITOP OR destkey srckey1 ..... srckeyN,对一个或者多个 key 求逻辑或,并将结果保存到 destkey

BITOP XOR  destkey srckey1 .... srckeyN,对一个或者多个key,求逻辑异或,并将结果保存到 destkey

BITOP NOT destkey srckey1,对给定key求逻辑非,并将结果保存到destkey

应用场景
  • 用户访问统计
  • 在线用户统计

Hyperloglogs

提供了一种不太准确的基数统计方法,比如统计网站的UV,存在一定的误差

Streams

5.0 推出的数据类型。支持多播的可持久化的消息队列,用户实现发布订阅功能。

总结

对象

对象type 属性值

type命令输出

底层可能的存储结构

object encoding

字符串对象

OBJ_STRING

"string"

OBJ_ENCODING_INT \OBJ_ENCODING_EMBSTR\OBJ_ENCODING_RAW

int\embstr\raw

列表对象

OBJ_LIST

“list”

OBJ_ENCODING_QUICKLIST

quicklist

哈希对象

OBJ_HASH

"hash"

OBJ_ENCODING_ZIPLIST\OBJ_ENCODING_HT

ziplist\hashtable

集合对象

OBJ_SET

"set"

OBJ_ENCODING_INSERT

intset\hashtable

有序集合对象

OBJ_ZSET

"zset"

OBJ_ENCODING_ZIPLIST\OBJ_ENCODING_SKIPLIST

ziplist\skiplist

编码转换总结

对象

原始编码

升级编码

字符串对象

INT

embstr

raw

整数并且小于long 2^63-1

超过44字节,被修改

哈希对象

ziplist

hashtable

键和值的长度小于64byte,键值对个数不超过512个,同时满足

列表对象

quicklist

集合对象

intset

hashtable

元素都是整数类型,元素个数小于512个,同时

有序集合对象

ziplist

skiplist

元素数量不超过128个,任何一个member的长度小于64字节,同时满足