一、String
1. 基本操作
- k-v 都是String
- 添加值时,如果不带过期参数,默认永不过期
- 数据类型都是针对value而言,key永远是string
# 1. 添加/获取/删除 key
SET key value ;
GET key;
DEL key;
# key存在,在value后加一个value,返回字符串长度
# key不存在,新建一个key并给value值
APPEND key value;
# 获取字符串长度, 若key不存在,返回0
STRLEN key
# 2. 字符串截取, 0 ~ -1 代表截取全部
GETRANGE key start end
# 字符串替换, 从第几位开始,将后面的数据替换为value,
# 例子: set name abcdefg, setrange name 1 xx; axxdefg
SETRANGE key offset value
# 3. 进阶操作
# 4.1 两次set同一个key, 都返回OK, 覆盖操作,默认永不过期
# 4.2 setex: (set + expire)带过期时间的操作,返回值ok
# 4.3 setnx: (set if not exist) 如果不存在,则放进去, 返回值1或0
SETEX key seconds value # seconds为0的时候,表示永不过期
SETNX key value
# 4. 批量操作, 效率更高
# 5.1 mset [k-v]: 批量无条件添加
# 5.2 msetnx [k-v]: 批量不存在再添加, 返回值为1或者0
# 具有事务属性,一个k-v失败,当前操作回滚
MSET k1 v1 k2 v2 k2 k3 v3
MSETNX k1 v1 k2 v2 k3 v3
MGET k1 k2 k3
# 5. getset: 获取原来的值并返回,同时修改这个值
# 6.1 原k不存在时,返回nil
# 6.2 原k存在时,返回原来的值
GETSET key value
2. 自增/自减
- redis操作是原子性,采用单线程处理所有业务,命令是依次执行的,无需考虑并发影响
- 用自增/自减作为唯一id的生成
# 1. integer值运算
# 1.1 必须用在整数上,否则 ERR value is not an integer or out of range
# 1.2 返回操作后的key的值
# 1.3 如果不存在key,则新建并初始化为0
# 1.4 自增的值可以为负数
# 1.5 自增存在最大值: java中long的最大值
# 自增自减
INCR key
DECR key
# key增加value
INCRBY key value
DECRBY key value
# 2. 小数形式
INCRBYFLOAT key value
二、 List
- List双向链表,元素有序重复, 类似 LinkedList
- 在左边和右边插入效率高,中间插入相对慢
# 1. 增加: 返回当前key所包含的元素的个数
# RPUSH LPUSH
LPUSH key element
LPUSH key element1 element2
# 2. 移除:返回移除的元素
LPOP key count
RPOP key count
# 3. 获取 第一个L代表list的意思
LRANGE key 0 -1 # 获取所有元素
LINDEX key index # 获取指定索引元素
LLEN key
LREM key count value # 移除指定个数指定值,返回移除的个数,精确匹配
LTRIM key start end # 将list截断, 作为新的List
# 4. 复杂操作
RPOPLPUSH source dest # source右弹一个,左压到dest的list; only supported
LSET key index value # 给指定下标赋值
LINSERT key BEFORE/AFTER pivot value # 在pivot元素前或后插入一个值
三、Set集合
- 元素无序不重复
1. 基本使用
# 1. 增加
SADD key elemment
SADD key element1 element2 element3
# 2. 移除
SREM key element
SREM key element1 element2 element3
# 3.查看
SMEMBERS key # 查看所有元素
SISMEMBER key element # 判断set中是否包含某个元素
SCARD key # 获取某个集合的长度
SRANDMEMBER key # 随机获取集合中的一个元素, 可以带个数
SRANDMEMBER key count
SPOP key # 随机弹出一个元素,返回弹出来的元素
SPOP key count
SMOVE src dest value # 将src中value元素剪切到dest中
SINTER key1 key2 key3 # 交集
SDIFF key1 key2 key3 # 差集
SUNION key1 key2 key3 # 并集
2. 应用
# 1. 随机推荐
- 比如感兴趣的话题: 从话题的set中随机弹出几个,并将该话题推荐给客户
- 如果客户感兴趣,则后续继续推荐
四、Hash
1. 基本使用
- key为string, value为Map
# 1. 添加获取 以H开头
HSET key field1 value1 field2 value2 field3 value3 # 返回插入的map的k-v数
HGET key field
HGETALL key # 获取到所有的对应的键值对
# 批量操作,返回值ok,带事务属性, 覆盖field
HMSET key field1 value1 field2 value2 field3 value3
HMGET key field1 field2
# 3. 获取
HLEN key # key的 k-v对数
HEXISTS key field # key的指定field是否存在
HKEYS key # 指定key的所有key
HVALS key # 指定key的所有value
# 4. 删除, 根据field删除k-v对
HDEL key field1, field2, field3
# 5. 增加: map的某个属性增加多少 ,返回增加后的数据
# 减少: 设置numbers为负数即可
HINCRBY key field numbers
# 6 . add if not exist: 返回添加的field的个数
HSETNX key field value
2. 应用
# 1. bean对象
可以用来装bean对象,不要滥用
# 2. 购物车
- 用户id作为key
- 商品编号作为field,商品数量作为value
- 多个商品
# 3. 促销活动: 不同商家(三大运行商),推出 30,50, 100的充值卡抢购, 每个卡都是1000最多
- 商家id作为key
- 不同充值卡编号作为field
- 充值卡对应的数量作为value
五、ZSet
- 有序集合,增加了权重标识
排行榜数据
# 1. 插入
# 1.1 返回插入的element个数, member 重复就覆盖
ZADD key score1 member1 score2 member2
# 返回当前所有的member,socre不显示
ZRANGE key 0 -1
ZREM key member1, member2
ZCARD key # member的个数
ZCOUNT key min max # score在这个区间的所有member
# 3.排序
# 3.1 按照分数排序,最小到最大, 只返回membe
ZRANGEBYSCORE key -inf +inf
# 3.2 显示分数
# 1) "erick"
# 2) "200"
# 3) "steven"
# 4) "400"
# 5) "jack"
# 6) "500"
ZRANGEBYSCORE key -inf +inf WITHSCORES
# 3.3 按照分数从大到小
ZREVRANGE key 0 -1 WITHSCORES
# 4 随机获取
ZRANDMEMBER key count
ZRANDMEMBER key count WITHSCORES
六、Geospatial
- 存放经纬度,地理位置信息
附近的人
打车
# 1. 添加. (纬度,经度,名称)
GEOADD key longitude1 latitud1 member1 longitude2 latitud2 member2
# 2. 查询经纬度
GEOPOS key member1 member2
# 3. 显示两个地方的直线距离
GEODIST key member1 member km
# 4. 某个坐标半径内的地方
GEORADIUS key longitude1 latitud1 number km
# 5. 某个元素方圆多少的其他元素
GEORADIUSBYMEMBER key member number km
七、 HyperLogLog
- 集合中,不重复元素总个数
- 基数统计
网站访问量,同一个用户访问多次,只能算一个
总数数统计存在一定的误差性,适用于对精确度要求不高的场景
# 1. 传统实现: 可以将用户的id保存在set里面起到去重效果,
# 如果保存数据太多,内存扛不住,
# 而且目的不是保存元素,只是计数
# 2. Redis: 保存 2^64个不同的数据,只需要固定的12kb内存
# 具有0.81%的误差
PFADD key element1 element2 element3 # 返回1为成功
PFCOUNT key # 统计不重复元素的总个数
PFCOUNT key1 key2 # 两个集合合并起来, 统计不重复元素个数
PFMERGE dest src1 src2 src3 # 将src的合并到dest, src的不变
八、 Bitmap
- 用0和1表述数据,如果一个数据只有两个状态,则可以用这种数据类型
- 利用bit的数据格式,通过二进制的方法来保存数据
# 1. 为key在不同的day中设置 0 或者1 ,返回值为0
SETBIT key 2 0 # 在数据的第二位上给0,
SETBIT key 12 1 # 在数据的第12位上给1,前面的全部用0来补
# 2. 获取具体哪天的value
GETBIT key 2
# 3. 统计状态为1的数据
BITCOUNT key [start end]