本文主要是讲解了 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只给出成员 |
| 获取geohash | geohash key member [member …] | geohash会将二维经纬度转换为一维字符串 |
| 删除地理位置信息 | zrem key member | GEO没有提供删除成员的命令,但是因为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应用开启了事物,则开启应用,期间该应用的所有命令会被认定为在一个事物中