书里面的示例是用python实现的,我这边用node实现了下
安装配置
参考文档
https://groups.google.com/g/redis-db
安装
Mac安装:
1  | xcode-select --install  | 
windows
官方不支持,可以用docker(https://hub.docker.com/_/redis/)
redis-py
1  | pip install redis  | 
数据结构
命令COMMAND - https://redis.io/commands
字符串
- 文字数据 | 二进制数据 均可
 - 制定命名格式 - 提升可读性+避免键名冲突
 - 多个字符串键存储相关联的一组数据 - 技术可行,并不最有效
SET | GET | GETSET
NX(只在键不存在的情况下为它设置值) | XX (只在键已经存在的情况下为它设置新值)MSET
减少网络通信次数,从而减少程序执行多个设置操作的时间MGET
MSETNX
只要有一个键有值,会放弃对所有给定键的操作STRLEN
GETRANGE
 GETRANGE key start end- 位于start&end的值也包含
SETRANGE
 SETRANGE key index substitute- 自动扩展,空字节填充
APPEND
 - 键不存在-设置;键存在-追加
INCRBY | DECRBY | INCR | DECR | INCRBYFLOAT
可用于计数器 | id生成器 | 限速器 
散列
- 通过散列键,包相关联的多项数据存储到一个散列中
 - eg. 短网址生成程序
 - 无序
HSET | HSETNX | HGET
HSET hash field valueHINCRBY
没有提供减法操作,通过传负数增量来实现HINCRBYFLOAT
counterHSTRLEN | HEXISTS | HDEL | HLEN
login sessionHMSET | HMGET
HKEYS | HVALS | HGETALL
graph
文章存储字符串键和散列键比较
资源占用
内存&&CPU —— 散列支持的操作
字符串:SETRANGE|GETRANGE 
过期时间
字符串粒度更细,相比较
列表
- list
 - 线性有序结构
 
LPUSH | RPUSH | LPUSHX | RPUSHX
- -X 只对已存在对列表执行推入操作
LPOP | RPOP | RPOP | RPOPLPUSH
 - FIFO 队列
LLEN | LINDEX | LRANGE
 - 分页
LSET | LINSERT | LTRIM | LREM
 - ToDo List
BLPOP | BRPOP | BRPOPLPUSH
 - 有阻塞功能的消息队列
 
集合
- 非重复元素
 - 无序
SADD | SREM | SMOVE | SMEMBERS | SCARD | SISMEMBER
 - unique count
 - tag
 - thumb
 - vote
 - social relationship
SRANDMEMBER | SPOP
 - 抽奖
 
SINTER | SINTERSTORE | SUNION | SUNIONSTORE | SDIFF | SDIFFSTORE
- 共同关注
 - 反向索引构建商品筛选器
 
有序集合
- sorted set
 
ZADD | ZREM | ZSCORE | ZINCRBY | ZCARD | ZRANK | ZREVERANK | ZRANGE | ZREVERANGE
- ZADD - O(M*log(N))
 - 排行榜
 
ZRANGEBYSCORE | ZREVERAMGEBYSCORE | ZUNIONSTORE | ZINTERSTORE
- 商品推荐
 
ZRANGEBYLEX | ZRVERANGEBYLEX | ZLEXCOUNT | ZERMRANGEBYLEX
- 自动补全
 
ZPOPMAX | ZPOPMIN | BZPOPMAX | BZPOPMIN
HyperLogLog
- 概率算法,对大量元素进行计数,算出近似基数
 - 使用固定大小内存
 - PFMERGE - HyperLogLog-PFCOUNT
 - 可以用于去重
 - 基数统计:cardinality of a set is a measure of the “number of elements” of the set
 - standard error - 0.81%