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的后面或者前面插入想要插入的值 |

三、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 | geoadd china:city 103.82 25.60 qujing |
位置是经度和纬度
2.geopos [key] [city] 获得地理位置的经纬度
1 | geopos china:city qujing |
3.geodist获得两个地理位置之间的直线距离
1 | geodist china:city qujing kunming km |
最后一个地方填写的是单位
4.georadius 获得给定坐标范围距离内的城市
1 | georadius china:city 102 25 1000 km count [number] |
5.georadiusbymember 使用元素作为中心
1 | georadiusbymember china:city qujing 100 km |
包括中心
由于这个其实是一个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的个数 |



