Redis 拓展命令

本文主要是讲解了 redis 的拓展命令

Redis 拓展命令

1. Redis 位图

Redis 对于位图(Bitmaps)的操作

操作命令
获取键的第offset位的值(从0开始算)getbit key offset
获取键指定范围值为1的个数bitcount key [start] [end]
Bitmaps间的运算(op 有 and(交集)、or(并 集)、not(非)、xor(异或),操作并将结果保存在destkey中)bitop op destkey key [key….]
计算Bitmaps中第一个值为targetBit(0 或 1)的偏移量bitpos key targetBit [start] [end]

Redis 位图内部实现

  • Bitmaps 本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。
  • Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符 串的方法不太相同。可以把 Bitmaps 想象成一个以位为单位的数组,数组的 每个单元只能存储0和1,数组的下标在 Bitmaps 中叫做偏移量。

Redis 位图的实践注意点

合理利用bitmaps可有效的减少内存的占用。如:统计当前网站 UV,当前网站有一亿用户,UV五千万,使用 set 和 bitmaps 分别为 400MB 和 12.5MVB。但是如果 UV 只有10W,则 set 只需要 800KB,bitmaps 依旧为12.5MB。因此需要结合实际情况判断是否使用bitmaps。

2. Redis HyperLogLog

Redis 对于 HyperLogLog 的操作

操作命令
添加元素pfadd key element [element …]
计算一个或多个HyperLogLog的独立总数pfcount key [key …]
合并pfmerge destkey sourcekey [sourcekey …]

Redis HyperLogLog内部实现

HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。

Redis HyperLogLog的实践注意点

HyperLogLog内存占用量非常小,但是存在错误率,开发者在进行数据结构选型时只需要确认如下两条即可:

  • 只为了计算独立总数,不需要获取单条数据。
  • 可以容忍一定误差率,毕竟HyperLogLog在内存的占用量上有很大的优 势

3. Redis 发布订阅模式

Redis 发布订阅模式命令

操作命令
发布消息publish channel message
订阅消息subscribe channel [channel …]
取消订阅unsubscribe channel [channel …]
按照模式订阅psubscribe pattern [pattern…] (pattern为通配符)
按照模式取消订阅punsubscribe pattern [pattern …] (pattern为通配符)
查看活跃的频道pubsub channels [pattern]
查看频道订阅数pubsub numsub [channel …]
查看模式订阅数pubsub numpat

Redis 发布订阅实践注意点

  • 客户端在执行订阅命令之后进入了订阅状态,只能接收subscribe、 psubscribe、unsubscribe、punsubscribe的四个命令。
  • 新开启的订阅客户端,无法收到该频道之前的消息,因为Redis不会对 发布的消息进行持久化。

GEO

Redis GEO 相关命令

操作命令备注
增加地理位置信息geoadd key longitude latitude member [longitude latitude member …](longitude、latitude、member分别是该地理位置的经度、纬度、成员)
获取地理位置信息geopos key member [member …]
获取两个地理位置的距离geodist key member1 member2 [unit]其中unit代表返回结果的单位,包含以下四种:m(meters)代表米;km(kilometers)代表公里;mi(miles)代表英里;ft(feet)代表尺
获取指定位置范围内的地理信息位置集合georadius key longitude latitude radiusm | km | ft | mi [withcoord] [withdist] [withhash] [COUNT count] [asc | desc] [store key] [storedist key]georadius命令 的中心位置会给出具体的经纬度
获取指定位置范围内的地理信息位置集合georadiusbymember key member radiusm | km | ft | mi [withcoord] [withdist] [withhash] [COUNT count] [asc | desc] [store key] [storedist key]georadiusbymember只给出成员
获取geohashgeohash key member [member …]geohash会将二维经纬度转换为一维字符串
删除地理位置信息zrem key memberGEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以 可以借用zrem命令实现对地理位置信息的删除

Redis GEO 需要注意的地方

  • Redis3.2提供了GEO功能,用来实现基于地理位置信息的应用,但 底层实现是zset。
  • Redis geohash 字符串越长,表示的位置更精确,geohash 在长度为9时,精度在2米左右。

Redis 事物

Redis 事物相关命令

操作命令
开始事物multi
结束事物exec
监控key(如果监控的key被其他命令改动过,则事物取消)watch key
取消事物(放弃事务块中的所有命令)discard

Redis 事物需要注意的地方

  • redis的事物实际上是将客户端的命令缓存起来,之后统一发送给服务端原子性执行
  • redis不支持事物回滚操作
  • redis不支持一致性
  • redis的事物是针对于客户端的,如果一个java应用开启了事物,则开启应用,期间该应用的所有命令会被认定为在一个事物中