redisd的五大数据类型

一、string

命令 作用
append 在字符串数据后面追加一个字符串,如果当前字符串不存在就新建
strlen 获得字符串的长度
incr[key]/decr[key] 自增/自减,如果字段不存在就新建一个,里面如果有其他字符就报错
incrby [key] [step]/decrby [key] [step] 自增/自减,但是具有步长
getrange [key] [start] [end] 截取字符串 使用开始和结束的索引,包括开始和结束,如果要读取一整个的话,就使用end=-1
setrange [key] [index] [replace] 从索引后面开始替换,有几个替换几个例如 123456789=》setrange name 1 xx=>1xx456789
setnx [key] [value] 如果不存在才设置,存在就设置不了
setex [key] [time] [value] 设置一个值,在time秒后过期
mset [key1] [value] [key2] [value] 批量设置key的值
mget [key1] [key2] [key3] 批量获得key的值
msetnx [key1] [value] [key2] [value] 批量设置值,如果不存在的话才设置,不然都会失败,是一个原子性操作
mset [class] :[属性]:[属性] [value] **批量设置对象的属性,实现同一个key的复用 mset user:1:name saxon user:1:age 18 **
getset [key] [value] 先得到值,在把值进行一个新的设置

String的应用场景:

  • 计数器
  • 统计多单位的数量

二、List

基本命令

命令 作用
Lpush [key] [value] [value] 在集合中里面设置值,采用堆的方法,先进的排在后面
Lrange [key] [start] [end] 获得指定集合,start与end之间的元素,包括末尾元素
Rpush [key] [value] [value] 从右边插入值,关于右边和左边的区别在后面解释
Lpop/Rpop [key] 从左边或者右边弹出第一个属性值
Lindex [key] [index] 获得位于index处的元素值
Llen [key] 获得key的list长度
Lrem [key] [count] [value] 移除key里面的count个value
Ltrim [key] [start] [end] 只留下start与end里面的值,包括头(start)和尾(end)所在的地方
RpopLpush [source] [other] 先把源里面的第一个元素(队首)弹出到另一个队列的队尾
Lset [key] [index] [value] 修改index位置上的元素,如果不存在list或者index超出范围就会报错
Linsert [key] after|before [value] [new value] 在key里面指定的value的后面或者前面插入想要插入的值

image-20201117230607607

三、set

命令 作用
Sadd [key] [value] [value] vaule[] 向set里面添加一个元素,添加重复的会失败
sismember [key] [value] set集合里面是否存在value
Scard [key] 获得集合里面元素的个数
Srem [key] [value] [value] 批量移除集合里面的元素
Smembers [key] 获得集合里面的所有元素
Srandmember [key] [count] 从集合key里面随机选择出[count]个元素 默认是抽取一个元素
Smove [key] [other key] [value] 把一个元素移动到另一个集合里面
Sdiff [key1] [key2] [key3] 第一个集合里面与其他集合不同的元素
Sinter [key] [key] 查询集合之间的共同元素
Sunion [key] [key] [key] 求出集合里面的所有元素;

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
使用场景:

1**.共同好友、二度好友**

2.利用唯一性,可以统计访问网站的所有独立 IP

3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐

四、Hash(map)

命令 作用
Hset [key] [field] [value] 向集合里面添加map,添加一个问field的属性
hget [key] [field] 获得集合里面具体的属性值
Hmset [key] [field1] [value1] [field2] [value2] 批量添加属性和值,没有属性就添加,有就覆盖
Hmget [key] [field] [field] [field] 批量获得属性值
Hgetall [key] 获得全部的键值对
Hdel [key] [field] [field] 删除多个属性值,删除多个键值对
Hlen [key] 获得长度
Hexists [key] [field] 判断是否有某一个元素
Hkeys [key] 获得map所有的key
Hvals [key] 获得map里面所有的field
Hincrby [key] [field] [stepment] 属性自增有步长默认是一

更加适合于对象的存储

五、Zset(有序集合)

命令 作用
zadd [key] [index] [value] [index] [value] 通过序号和值来添加集合
Zrange [key] [start] [end] 获得指定区间的元素
Zrangebyscore [key] [min] [max] [withscores] 排序通过score,在区间之间,最后一个属性可以添加也可以不添加,添加就会在输出的时候加上score
Zrevrange [key] [start] [end] 由大到小排序元素
Zcard [key] 获得元素的个数
Zcount [key] [start] [end] 获得区间里面的元素个数

三大特殊数据类型

一、geospatial 地理位置

1、geoadd添加一个地理位置,可以添加多个

1
2
geoadd china:city  103.82 25.60  qujing
geoadd [key] [经度] [纬度] [cityname]

位置是经度和纬度

2.geopos [key] [city] 获得地理位置的经纬度

1
2
geopos china:city qujing
geopos [key] [cityname]

3.geodist获得两个地理位置之间的直线距离

1
2
3
geodist china:city qujing kunming km
geodist [key] [city1] [city2] [单位]
结果:"128.5878"

最后一个地方填写的是单位

4.georadius 获得给定坐标范围距离内的城市

1
2
georadius china:city 102 25 1000 km count [number]
georadius [key] [location] [范围] [单位] count [显示几个结果]

5.georadiusbymember 使用元素作为中心

1
2
georadiusbymember china:city qujing 100 km
georadiusbymember [key] [member] [距离] [单位]

包括中心

由于这个其实是一个Zset集合所以我们可以使用srem来移除我们存在数据库里面的地理位置信息

二、hyperloglog

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。 Redis HyperLogLog 是用来做基数统计的算法,

HyperLogLog 的优点是,在输入元素的数量或者体积 非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。 HyperLogLog则是一种算法,它提供了不精确的去重计数方案。

举个栗子:假如我要统计网页的UV(浏览用户数量,一天内同一个用户多次访问只能算一次),传统的 解决方案是使用Set来保存用户id,然后统计Set中的元素数量来获取页面UV。但这种方案只能承载少量 用户,一旦用户数量大起来就需要消耗大量的空间来存储用户id。我的目的是统计用户数量而不是保存 用户,这简直是个吃力不讨好的方案!而使用Redis的HyperLogLog最多需要12k就可以统计大量的用户 数,尽管它大概有0.81%的错误率,但对于统计UV这种不需要很精确的数据是可以忽略不计的。 什么是基数? 比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

命令 作用
pfadd [key] [value] [value] 向集合里面添加元素
pfcount [key] 统计集合里面的元素
pfmerge [source] [key] [key] 将两个集合的统计结果并到一个新的集合里面去,计算基数

一般使用来进行人流量的统计

三、bitmaps

在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或者不登录;又如 需要记录用户一年的打卡情况,打卡了是1, 没有打卡是0,如果使用普通的 key/value存储,则要记录 365条记录,如果用户量很大,需要的空间也会很大,所以 Redis 提供了 Bitmap 位图这中数据结构, Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1;如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:0101000111000111………………………,这样有什么好处呢?当然就是节约内存 了,365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。

BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上 底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了setbit, getbit, bitcount 等几个 bitmap 相关命令。

命令 作用
setbit [key] [field] [value] 给一个元素设置属性,只可以设置0和1
getbit [key] 可以获得存在里面的元素值
bitcount [key] 统计里面值为1的个数