redis中的数据都是以key/value的形式存储的,五大数据类型主要是指value的数据类型
字符串string#设置值 set stu wang #获取值 get sty #判断key是否存在 exists stu #追加字符串,如果key不存在,相当于set命令,返回值为追加之后的strlen append stu jiaxin #获取字符串的长度 strlen key1 #对指定key的value自增1/自减1,value要为整数值 incr key decr key #设置增长/减少的步长 incr key 2 decr key 3 #获取给定范围的字符串,要获取全部传0到-1 getrange key1 0 -1 #从指定位置开始替换字符串的值 setrange key1 2 xxx #将key1的value从下标2开始替换为xxx #设置key1的值为hhh并设置过期时间为5s setex key1 5 hhh #设置key的值,如果key不存在则设置失败,返回0 setnx key value #同时设置多个key的值 mset key value [key value...] #同时获取多个key的值 mset key1 key2 ... #同时设置多个key的值,一个设置失败则全部失败(原子操作) msetnx key value [key value...]
用string存储对象时key值的设计
#设置一个user:1对象,值为Json字符串
set user:1 {name:wang,age:20}
#设置user:1的名字为wang,user:1的年龄为20
mset user:1:name wang user:1:age 20
#获取user:1的名字、年龄
mget user:1:name user:1:age
#获取key的value,然后key的value设置为newvalue
getset key newvalue
string类似的使用场景
- value除了是字符串也可以是数字!
- 计数器:文章浏览量,点赞数
- 统计多单位的数量
- 对象缓存存储
在Redis中,我们可以用list完成栈、队列、阻塞队列
# 链表左边插入值 lpush key value #链表右边插入值 rpush key value #获取指定范围的值 lrange key start stop #从列表的左边或者右边移除值 lpol key rpop key #获取key对应的value链表指定下标的值 lindex key index #获取列表中元素的个数 llen key #移除列表中的元素 lrem key count value lrem stu 1 wang #移除list中的1个wang #将链表修剪/截取到指定范围, 通过下标截取指定的长度,这个list已经改变了,只剩下截取的元素! ltrim stu 1 2 #移除列表中最后一个元素,将它添加到另一个列表中 rpoplpush key1 key2 #根据下标替换列表中的值 lset key index value #在列表中插入值 linsert key before|after value new_value
在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
队列(头删尾插):LPOP RPUSH
栈 (栈顶出入):LPOP LPUSH
集合setredis里面set是无序的,C++里面set是有序的,C++的unordered_set是无序set
set中的值是不能重复的
#给set中添加值 sadd key value1 value2 ... #获取set中的所有值 smembers key #判断某个值是否在set中 sismember key value #获取set中元素的个数 scard key #删除set中的值 srem key value1 value2.... #从set中获取随机值 srandmember key #从set中获取count个随机值 srandmember key count #随机删除指定个数个元素 spop key count #将指定的元素从一个set中移动到另一个set中 smove set1 set2 value
数字集合类
差集、交集、并集
抖音中,A用户将所有关注的人放在一个set集合中,将他的粉丝放在一个集合中,通过这几个运算可以实现共同关注,共同爱好,二度好友(推荐好友)等
#差集 sdiff set1 set2 #交集 共同还有可以通过这个实现 sinter set1 set2 #并集 SUNIOn set1 set2哈希hash
可以将哈希看成是一个Map集合,key-value中的value是一个map集合,key - {field1-value1,field2-value2}
#设置一个hash的值 hset key field1 value1 #获取一个hash的值 hget key field #设置或者获取多个fhash的值 hmset key field1 value1 field2 value2 ... hmget key field1 field2... #获取hash中的所有值 hgetall key #删除指定field的hash键值对 hdel key field #获取hash的键值对的个数 hlen key #判断hash中的字段是否存在 hexists key field #获取一个hash中的所有fields hkeys key #获取一个hash中国的所有value hvals value #给hash中指定字段的值加上一个增量 hincrby key field 2 #如果不存在,则添加,如果存在,则失败 hsetnx key field value
hash的应用
hash中存储经常变更的值:比如用户信息: user : name-value,age-value,sex-value
hash更适合对象的存储,String更加适合字符串存储
有序集合zset#添加一个值 zadd key scores value zadd myset 1 wang #添加一个值 zadd myset 2 yang 3 zhang #添加多个值 #获取zset中一个范围的值 zrange key start stop #将zset中的值按照score从小到大排序输出 zrangebyscore key min max #移除zset中指定的元素 zrem key value #查看zset中的元素个数 zcard key #根据score的值统计在给定区间的元素个数 zcount key min maxRedis的三种特殊类型 geospatial 地理空间
geo的底层就是一个zset集合,所以zset的命令可以应用于geoadd的key
#获取zset中一个范围的值 zrange china:city 0 -1 #移除zset中指定的元素 zrem china:city shanghai
#添加地理位置 geoadd key 纬度 经度 名称 GEOADD china:city 116.40 39.90 beijing #返回给定名称的纬度和经度 geopos key 名称 GEOPOS china:city xian #返回两个给定位置之间的距离,单位:米m,千米km,英里mi,英尺ft geodist key city1 city2 GEODIST china:city beijing xian km #返回指定元素的纬度和经度的字符串 geohash key city GEOHASH china:city xian #以给定的纬度经度为中心,找到某一半径内的元素 georadius key 经度 维度 半径 单位m|km|ft|mi #以一个成员为中心,查找指定半径范围内容的元素 georadiusbymember key city 半径 单位hyperloglog基数统计
A{1,3,5,7,8,7} B{1,3,5,7,8}
A和B的基数(不重复的元素个数)= 5, 可以接受一定的误差!
Redis Hyperloglog 是基数统计的算法。0.81%的错误率!
优点: 占用的内存是固定的,2^64不同的元素计数,只需要12KB的内容空间。
bitmaps是位图存储的,都是二进制位来进行记录, 所以只要是只有两种状态值的场景,都可以使用bitmaps来存储。比如:登录、未登录;打卡,未打卡;活跃,不活跃等
#在bitmaps中添加数据 setbit key offset value SETBIT sign 0 1 SETBIT sign 1 1 SETBIT sign 2 1 SETBIT sign 3 0 #查看位图中某个位置的值 getbit key offset #统计位图中value等于1的个数 bitcount key start end



