Redis支持的数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合) 及 zset(sorted set:有序集合)。与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。==
!!!!!!!!!以下内容摘自菜鸟教程!!!!!!!!!!!
Key
Redis 键命令用于管理 redis 的键
命令
命令 | 描述 |
---|---|
DEL key | 删除key(key必须存在才可以) |
EXISTS key | 检查给定key是否存在 |
EXPIRE key seconds | 为指定key设置过期时间 单位为秒 |
KEYS * | 查找所有key |
KEYS pattern | 查找给定(pattern)的key |
MOVE key db | 将指定key移动到数据库db中 |
TTL key | 返回key的剩余过期时间 单位为秒 |
RANDOMKEY | 从数据库中随机返回一个key |
RENAME key newkey | 修改key的名字为newkey |
TYPE key | 返回key存储值的数据类型 |
String(字符串)
Redis 字符串数据类型的相关命令用于管理 redis 字符串值
命令
命令 | 描述 |
---|---|
SET key value | 设定指定key的值 |
GET key | 获取指定key的值 |
GETSET key value | 设置指定key的值,并返回key的旧值 |
MSET key value [key value…] | 同时设置多个key value |
MGET key1 [key2…] | 同时获取多个key的值 |
SEXEX key seconds value | 设置key value 并指定过期时间 |
SEXNX key value | 在key不存在的时候设置key的值,存在则不设置 |
SETRANGE key offset value | 覆盖指定key的value值 从offset(偏移量)开始 |
GETRANGE key start end | 截取start开始end结束的字符串 |
INCR key count | 将key中的数字自增count |
DECR key count | 将key中的数字自减count |
STRLEN key | 返回key存储的字符串长度 |
MSETNX key1 value1[key2 vaue2] | key不存在设置,原子性 |
设置对象
set user:1 {name:zhangsan,age:12} 设置对象
mset user:1:name zhangsan user:1:age 12
设置一个user:1对象 值为json字符串来保存
,get user:1name user:1age
获取user:1 的name age 值
这里的key是这样设计的
user:{id} :{field}
List(列表)
命令
命令 | 描述 |
---|---|
LPUSH key element [element] | 插入一个或多个值到列表头部(左) |
RPUSH key element [element] | 插入一个或多个值到列表为部(右) |
LPOP key | 移除列表的第一个元素 |
RPOP key | 移除列表的最后一个元素 |
LRANGE key start stop | 获取指定范围内列表的值 |
LRANGE key 0 -1 | 获取列表中所有值 |
LLEN key | 获取列表长度 |
LINDEX key index | 获取列表中指定索引的值 |
LREM key count value | 移除列表中指定count个数的值 |
LTRIM key start stop | 截取列表中指定区间的值 |
RPOPLPUSH srouce destination | 移除列表最后一个元素,将元素添加到另一个列表 |
LSET key index value | 通过索引替换指定元素的值 |
INSERT key after/before piovt element | 在列表元素的前面或后面插入元素 |
Set(集合)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
命令
命令 | 描述 |
---|---|
SADD key member1 [member2…] | 向set集合中添加一个或多个成员 |
SCARD key | 获取集合中成员数量 |
SMEMBERS key | 获取集合中所有成员 |
SISMEMBER key member | 查看集合中是否存在member成员 |
SREM key member | 移除集合中指定元素 |
SRANDMEMBER key | 随机抽取集合中某个元素 |
SRANDMEMBER key count | 随机抽取集合中count个元素 |
SPOP key | 随机删除集合中某个元素 |
SPOP key count | 随机删除集合中count个元素 |
SMOVE source destination member | 移动指定集合中的元素到另一个集合中 |
SDIFF key1 [key2…] | 查看给定集合中的元素差集 |
SINTER key1 [key2…] | 查看给定集合中的元素交集 |
SUNION key1 [key2] | 查看给定集合中的元素并集 |
Hash(哈希)
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
命令
命令 | 描述 |
---|---|
HSET key field value | 将hash表中key的field字段的值设置为value |
HGET key field | 获取hash表中key的field字段值 |
HGETALL key | 获取hash表中指定key的所有字段和值 |
HMSET key field value [fiedl vlaue …] | 同时设置多个field字段到key中 |
HMGET key field [field…] | 同时获取所有给定字段的值 |
HDEL key field [fiedl…] | 删除一个或多个hash表字段 |
HLEN key | 获取hash表中字段的数量 |
HEXISTS key | 查看hash表中给定字段是否存在 |
HKEYS key | 获取hash表中所有key |
HVALS key | 获取hash表中所有value |
HINCRBY key field increment | 为hash表中key中指定字段加上增量increment |
HSETNX key field value | 在字段field不存在时,设置值 |
Zset(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
命令
命令 | 描述 |
---|---|
ZADD key source1 member1[source2 member2] | 向有序集合添加一个或多个成员,或者更新已存在的成员值 |
ZRANGE key start end | 通过索引区间返回有序集合指定区间内的成员 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZINTERSTORE destination numkeys key [key …] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
ZLEXCOUNT key min max | 在有序集合中计算指定字典区间内成员数量 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员(升序) |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低(降序) |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
Geospatial (地理位置)
geoadd
geoadd key 经度 纬度 名称
将指定的地理空间位置(经度、纬度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
例子
# 将指定的 经度 纬度 名称 添加到china:city中
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.50 38.04 hebei
(integer) 1
127.0.0.1:6379> geoadd china:city 117.19 39.14 tianjin
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.08 22.54 shenzhen
(integer) 1
geopos
geopos key member
从key里返回所有给定位置元素的位置(经度和纬度)。
例子
# 从 China:city这个key中获取 名称为hebei 的 位置 返回 经度 纬度
127.0.0.1:6379> geopos china:city hebei
1) 1) "114.50000256299972534"
2) "38.03999889245756805"
127.0.0.1:6379> geopos china:city tianjin
1) 1) "117.19000071287155151"
2) "39.13999943813936255"
127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.49999767541885376"
2) "29.52999957900659211"
geodist
geodist key member` member2...
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
例子
# 查看北京到河北的直线距离 单位km
127.0.0.1:6379> geodist china:city beijing hebei km
"264.1731"
# 查看北京到天津的直线距离 单位km
127.0.0.1:6379> geodist china:city beijing tianjin km
"108.3507"
georadius
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:
-
m 表示单位为米。
-
km 表示单位为千米。
-
mi 表示单位为英里。
-
ft 表示单位为英尺。
在给定以下可选项时, 命令会返回额外的信息: -
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
-
WITHCOORD: 将位置元素的经度和维度也一并返回。
-
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
- ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
- DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
例子
# 以 110 40 这个经纬度为中心,查找方圆 1000 km内的城市
127.0.0.1:6379> georadius china:city 110 40 1000 km
1) "hebei"
2) "tianjin"
3) "beijing"
127.0.0.1:6379> georadius china:city 110 40 500 km
1) "hebei"
# 显示周围城市到指定经纬度为中心的直线距离
127.0.0.1:6379> georadius china:city 110 40 500 km withdist
1) 1) "hebei"
2) "445.7217"
# 显示经纬度
127.0.0.1:6379> georadius china:city 110 40 500 km withcoord
1) 1) "hebei"
2) 1) "114.50000256299972534"
2) "38.03999889245756805"
GEORADIUSBYMEMBER
这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点
指定成员的位置被用作查询的中心。
例子
# 查询距离河北264公里外的城市
127.0.0.1:6379> GEORADIUSBYMEMBER china:city hebei 264 km
1) "hebei"
2) "tianjin"
geohash
返回一个或多个位置元素的 Geohash 表示。
例子
127.0.0.1:6379> geohash china:city hebei tianjin
1) "wwc2msbr530"
2) "wwgqdtpphb0"
注意
Geo底层就是Zset 可以通过zset命令来操作
# 查看地图中全部元素
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "hebei"
4) "tianjin"
5) "beijing"
# 移除地图中某个元素
127.0.0.1:6379> zrem china:city hebei
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "tianjin"
4) "beijing"
Hyperloglog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
例子
# 创建第一组元素
127.0.0.1:6379> pfadd mykey a b c d e f g
(integer) 1
127.0.0.1:6379> type mykey
string
# 统计mykey中元素的基数
127.0.0.1:6379> pfcount mykey
(integer) 7
# 创建第二组元素
127.0.0.1:6379> pfadd mykey1 z x c v b n m
(integer) 1
127.0.0.1:6379> pfcount mykey1
(integer) 7
# 合并mykey mykey1 并集
127.0.0.1:6379> pfmerge mykey2 mykey mykey1
OK
127.0.0.1:6379> pfcount mykey2
(integer) 12
127.0.0.1:6379>
bitmap
使用bitmaps 记录周一到周日的打卡
# 添加周一到周日的打卡记录
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
# 查看周一是否打卡
127.0.0.1:6379> getbit sign 1
(integer) 1
# 统计一周的打卡天数
127.0.0.1:6379> bitcount sign
(integer) 4