String类型:
value可以是String类型,也可以是数字类型;String类型在redis内部存储默认就是一个字符串,当遇到incr、decr等操作就会转换成数值型进行计算,此时redisObject的encoding值为int。
可以存储字符串、数字
命令:
设置:set key value [EX seconds] [PX milliseconds] --设置过期时间EX表示秒 PX表示毫秒 设置带过期时间,如果存在就覆盖:SETEX KEY_NAME TIMEOUT VALUE 设置,如果存在就不操作:SETNX key value 批量设置:mset k1 v1 k2 v2 k3 v3 获取:get key 批量获取:mget k1 k2 k3 先get再set:getset key value #获取原来的值,并设置新值 删除:del key 自增:incr key 自减:decr key 查看长度:strlen key 截取字符串:getrange key 0 3 追加字符串:append a aaaaaa #如果不存在就相当于set 替换/追加字符串:setrange a 6 “abc”
场景1.分布式锁
SETNX lockkey 1 ex 10 --返回1证明获取锁成功
---------------------------执行业务操作
DEL lockkey --执行完业务释放锁
场景2.分布式ID、计数器
INCR order:id --获取单个id
INCRBY order:id --批量获取id
场景3.防止秒杀重复提交、重复排队
INCR userid --第一次执行返回1,之后执行递增,所以判断是否返回1,如果大于1说明已排队
Hash类型:
Hash是最接近关系型数据库结构的数据类型,可以将数据库中的一条记录或一个对象转换为hashmap存放在redis中
Hash是一个string类型的field、value的映射表。适合存储对象。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。Hash结构还可以使你像在数据库中Update一个属性一样只修改某一项属性值。
存储:hset key field1 value
存储(存在就不创建):hsetnx key field value
存储多个:hmset key field1 value1 field2 value2
获取:hget key field
获取多个字段:hmget key field1 field2
获取所有fied和value: hgetall key
删除:hdel key field
获取长度:hlen key
判断field是否存在:hexists key field
获取所有field:hkeys key
获取所有value:hvals key
field加减:hincrby key field 数字
场景1.存储对象
场景2.
List类型:
列表,数据结构是双向链表,可以存储列表结构的数据。
命令:
lpush key value -- 将元素加入列表左侧,可插入多个。如果list不存在就创建list rpush key value -- 将元素加入列表右侧 lrange key start end -- 范围获取,不删除(案例:获取全部 lrange mylist 0 -1) lpop key -- 从列表左侧获取一个元素并删除 rpop key -- 从列表右侧获取一个元素并删除 lindex key 1 -- 从列表左侧获取索引为1元素,不删除 llen key -- 查看列表长度 lrem key 个数 value -- 移除指定个数的指定值(案例:移除左侧两个值为aa的数据,lrem k 2 v) lset key 1 value -- 修改指定索引位置的值,如果不存在就会报错 linsert key <before|after> listvalue value --在指定值前面或后面插入值,如果list中有多个指定值,只在第一个前后插入(案例:linsert mylist before 8 10 --在8前面插入10)
使用场景:
栈(lpush、lpop)
队列(lpush、rpop)
阻塞队列(LPUSH、BRPOP)
场景1.防止库存超卖:
比如秒杀活动有10个产品,创建10个队列,每个队列存放一个产品,队列元素个数对应产品库存,每个队列元素中存放skuid,如果用户购买就pop一个元素,然后让用户去下单,这样处理不会出现超卖的情况
场景2.公众号:
set类型:
集合,和List的区别是Set元素无序且不可重复;
Set是Hash Table,相同的对象内容只能在Set中存在一次,后面在添加的对象内容会覆盖已经存在Set中的对象内容
Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存到一个新的集合中。
命令:
存储:sadd key value 获取全部元素:smembers key 是否存在某元素:sismember key value 查看元素个数:scard key 删除集合中的某个元素:srem key value 随机查找:srandmember key [count] -- 加了count参数可以获取多个随机数 随机移除元素:spop key 将指定元素移动到其他set:smove key key2 value --将value从key集合移动到key2集合 差集:sdiff key1 key2 --查找key1中key2不存在的元素 交集:sinter key1 key2
将多个集合合并到一个集合:SUNIONSTORE destination key [key ...]
场景1.去重、共同好友(sinter)、推荐好友(sdiff)
场景2.点赞、收藏
Zset类型:
有序集合,在set的基础上增加一个顺序属性,比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
场景1.排行榜、热搜榜
场景2.定时任务、处理过期项目(如果有新数据添加时,我们把它加到有序集合中,用时间做排序。开一个服务定时查询,取前十项,时间过期就删除数据。)
存储:zadd key score value -- score:分数,按分数排序 获取:zrange key start end -- zrange mysortset 0 -1 withscores 获取集合,并带排序 获取通过排序:zrangebyscore key min max [withscores] -- -inf、+inf表示负无穷、正无穷,withscore:附带排序值 删除:zrem key value 获取个数:zcard key
geospatial:(地理位置)
场景:附近的人
GEOADD:添加地理位置 geoadd key 经度 纬度 名称 案例:geoadd china:add 114 135 beijing GEODIST: GEOHASH: GEOPOS: GEORADIUS: GEORADIUSBYMEMBER:
Hyperloglog:
用来统计基数个数,多次add相同值,只记录一个,相比string类型占用内存少。有0.8%的误差。场景:统计UV
是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
pfadd key value # 添加
pfcount key # 统计数量
pfmerge key1 key2 # 合并
Bitmaps:位存储
适合存储只有两个状态的数据,节省内存,一位代表一个数据
场景:一年打卡、登录记录
setbit key 索引位置 [0 | 1] 添加,案例: setbit sign 0 1 getbit key 索引位置 获取 bitcount key 统计为1的个数