Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
string类型是Redis最基本的数据类型,string类型的值最大能存储512MB。
实例
127.0.0.1:6379> SET runoob "菜鸟教程"
OK
127.0.0.1:6379> GET runoob
菜鸟教程
127.0.0.1:6379>
在以上实例中我们使用了Redis的SET和GET命令。键为runoob,对应的值为菜鸟教程。
注意:一个键最大能存储512MB。
Hash(哈希)
Redis hash是一个键值(key=>value)对集合。
Redis hash是一个string类型的filed和value的映射表,hash特别适合用于存储对象。
实例
DEL runoob
用于删除前面测试用过的key,不然会报错:WRONGTYPE Operation against a key holding the wrong kind of value
。
127.0.0.1:6379> SET runoob "菜鸟教程"
OK
127.0.0.1:6379> GET runoob
菜鸟教程
127.0.0.1:6379> HMSET runoob field1 "Hello" filed2 "World"
WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> DEL runoob
1
127.0.0.1:6379> HMSET runoob field1 "Hello" filed2 "World"
OK
127.0.0.1:6379>
实例中我们使用了Redis HMSET,HGET命令,HMSET设置了两个field=>value对,HGET获取对应field对应的value。每个hash可以存储2^32-1键值对(40多亿)。
List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
实例
127.0.0.1:6379> DEL runoob
1
127.0.0.1:6379> lpush runoob redis
1
127.0.0.1:6379> lpush runoob mongodb
2
127.0.0.1:6379> lpush runoob rabbitmq
3
127.0.0.1:6379> lrange runoob 0 10
rabbitmq
mongodb
redis
127.0.0.1:6379>
列表最多可存储2^3-1元素(4294967295,每个列表可存储40多亿)。
Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加、删除和查找的复杂度都是O(1)。
sadd命令
添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0。
sadd key member
实例
127.0.0.1:6379> del runoob
1
127.0.0.1:6379> sadd runoob redis
1
127.0.0.1:6379> sadd runoob mongodb
1
127.0.0.1:6379> sadd runoob rabbitmq
1
127.0.0.1:6379> sadd runoob rabbitmq
0
127.0.0.1:6379> smembers runoob
mongodb
redis
rabbitmq
127.0.0.1:6379>
注意:以上实例中rabbitmq添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为2^32-1(4294967259,每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
实例
127.0.0.1:6379> DEL runoob
1
127.0.0.1:6379> zadd runoob 0 redis
1
127.0.0.1:6379> zadd runoob 0 mongodb
1
127.0.0.1:6379> zadd runoob 0 rabbitmq
1
127.0.0.1:6379> zadd runoob 0 rabbitmq
0
127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
mongodb
rabbitmq
redis
127.0.0.1:6379>
各个数据类型应用场景
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | – |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值 | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线)2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除、查找的复杂度都是O(1)2、为集合提供了求交集、并集、差集等操作 | 1、共同好友2、利用唯一性,统计访问网站的所有独立ip3、好友推荐,根据tag求交集,大于某一阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
Redis键命令用于管理redis的键。
语法
Redis键命令的基本语法如下:
redis 127.0.0.1:6379>COMMAND KEY_NAME
实例
127.0.0.1:6379> SET runoobkey redis
OK
127.0.0.1:6379> DEL runoobkey
1
127.0.0.1:6379>
在以上实例中DEL是一个命令,runoobkey是一个键。如果键被删除成功,命令执行后输出(integer)1,否则将输出(integer)0
Redis Keys命令:
序号 | 命令及描述 |
---|---|
1 | DEL key 该命令用于在key存在时删除key。 |
2 | DUMP key 序列化给定key,并返回被序列化的值。 |
3 | EXISTS key 检查给定key是否存在 |
4 | EXPIRE key seconds 为给定key设置过期时间,以秒计。 |
5 | EXPIREAT key timestamp EXPIREAT的作用和EXPIRE类似,都用于为key设置为过期时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp) |
6 | PEXPIRE key milliseconds 设置key的过期时间以毫秒计。 |
7 | PEXPIREAT key milliseconds-timestamp 设置key过期时间的时间戳(unix timestamp)以毫秒计 |
8 | KEYS pattern 查找所有符合给定模式(pattern)的key |
9 | MOVE key db 将当前数据库的key移动到给定的数据库db中 |
10 | PERSIST key 移除key的过期时间,key将持久保持 |
11 | PTTL key 以毫秒为单位返回key的剩余的过期时间。 |
12 | TTL key 以秒为单位返回给定key的剩余生存时间(TTL,time to live) |
13 | RANDOMKEY 从当前数据库中随机返回一个key。 |
14 | RENAME key newkey 修改key的名称 |
15 | RENAMENX key newkey 仅当newkey不存在时,将key改名为newkey |
16 | SCAN cursor [MATCH pattern][COUNT count] 迭代数据库中的数据库键 |
17 | TYPE key 返回key所存储的值类型 |
更多命令请参考:https://redis.io/commands
Redis字符串数据类型的相关命令用于管理redis字符串值,基本语法如下:
语法
redis 127.0.0.1:6379> COMMAND KEY_NAME
实例
127.0.0.1:6379> SET runoobkey redis
OK
127.0.0.1:6379> GET runoobkey
redis
127.0.0.1:6379>
在以上实例中我们使用了SET和GET命令,键为runoobkey。
Redis字符串命令
序号 | 命令及描述 |
---|---|
1 | SET key value 设置指定key的值 |
2 | GET key 获取指定key的值 |
3 | GETRANGE key start end 返回key中字符串的子字符 |
4 | GETSET key value 将给定key的值设为value,并返回key的旧值(old value) |
5 | GETBIT key offset 对key所存储的字符串值,获取指定偏移量上的位(bit) |
6 | MGET key1 [key2..] 获取所有(一个或多个)给定的key值 |
7 | SETBIT key offset value 对key所存储的字符串值,设置或清楚指定偏移量上的位(bit) |
8 | SETEX key seconds value 将值value关联到key,并将key的过期时间设为seconds(以秒为单位) |
9 | SETNX key value 只有在key不存在时设置key的值 |
10 | SETRANGE key offset value 用value参数覆盖写给定key所存储的字符串值,从偏移量offset开始 |
11 | STRLEN key 返回key所存储的字符串值的长度 |
12 | MSER key value [key value...] 同时设置一个或多个key-value对。 |
13 | MSETNX key value [key value...] 同时设置一个或多个key-value,当前仅当所有给定key都不存在 |
14 | PSETEX key milliseconds value 这个命令和SETX命令相似,但它以毫秒为单位设置key的生存时间,而不是像SETEX命令那样,以秒为单位 |
15 | INCR key 将key中存储的数字值增一 |
16 | INCRBY key increment 将key所存储的值加上给定的增量值(increment) |
17 | INCRBYFLOAT key increment 将key所存储的值加上给定的浮点增量值(increment) |
18 | DECR key 将key中存储的数字值减一 |
19 | DECRBY key decrement key所存储的值减去给定的减量值(decrement) |
20 | APPEND key value 如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值(value)末尾。 |
Redis hash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。
Redis中每个hash可以存储2^32-1键值对(40多亿)。
实例
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
name
redis tutorial
description
redis basic commands for caching
likes
20
visitors
23000
127.0.0.1:6379>
在以上实例中,我们设置了redis的一些描述信息(name,description,likes,visitors)到哈希表的runoobkey中。
Redis hash命令
序号 | 命令及描述 |
---|---|
1 | HDEL key field1 [field2] 删除一个或多个哈希表字段 |
2 | HEXISTS key field 查看哈希表key中,指定的字段是否存在 |
3 | HGET key field 获取存储在哈希表中指定字段的值 |
4 | HGETALL key 获取在哈希表中指定key的所有字段和值 |
5 | HINCRBY key field increment 为哈希表key中的指定字段的整数值加上增量increment |
6 | HINCRBYFLOAT key field increment 为哈希表key中的指定字段的浮点数值加上增量increment |
7 | HKEY key 获取所有哈希表中的字段 |
8 | HLEN key 获取哈希表中字段的数量 |
9 | HMGET key field [field2] 获取所有给定字段的值 |
10 | HMSET key field1 value1 [field2 value2] 同时将多个field-value(域-值)对设置到哈希表key中 |
11 | HSET key field value 将哈希表key的字段field的值设为value |
12 | HSETNX key field value 只有在字段field不存在时,设置哈希表字段的值。 |
13 | HVALS key 获取哈希表中所有值 |
14 | HSCAN key cursor [MATCH pattern][COUNT count] 迭代哈希表中的键值对 |
Redis列表是简单的字符串列表,按照插入顺序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含2^32-1个元素(4294967259,每个列表超过40亿个元素)
实例
127.0.0.1:6379> LPUSH runoobkey redis
1
127.0.0.1:6379> LPUSH runoobkey mongodb
2
127.0.0.1:6379> LPUSH runoobkey mysql
3
127.0.0.1:6379> LRANGE runoobkey 0 10
mysql
mongodb
redis
127.0.0.1:6379>
以上实例中我们使用了LPUSH将三个值插入了名为runoobkey的列表当中。
Redis列表命令
序号 | 命令及描述 |
---|---|
1 | BLPOP key1 [key2] timeout 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
2 | BRPOP key1 [key2] timeout 移出并获取最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
3 | BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
4 | LINDEX key index 通过索引获取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或后插入元素 |
6 | LLEN key 获取列表长度 |
7 | LPOP key 移出并获取列表的第一个元素 |
8 | LPUSH key value1 [value2] 将一个或多个值插入到列表头部 |
9 | LPUSHX key value 将一个值插入到已存在的列表头部 |
10 | LRANGE key start stop 获取列表指定范围内的元素 |
11 | LREM key count value 移除列表元素 |
12 | LSET key index value 通过索引设置列表元素的值 |
13 | LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都被删除。 |
14 | RPOP key 移除列的最后一个元素,返回值为移除的元素 |
15 | RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
16 | RPUSH key value1 [value2] 在列表中添加一个或多个值 |
17 | RPUSHX key value 为已存在的列表添加值 |
Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是intset或者hashtable。
Redis中集合是铜鼓哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)。
实例
127.0.0.1:6379> SADD runoobkey redis
1
127.0.0.1:6379> SADD runoobkey mongodb
1
127.0.0.1:6379> SADD runoobkey mysql
1
127.0.0.1:6379> SADD runoobkey mysql
0
127.0.0.1:6379> SMEBERS runoobkey
ERR unknown command 'SMEBERS'
127.0.0.1:6379> SMEMBERS runoobkey
mysql
mongodb
redis
127.0.0.1:6379>
以上实例我们通过SADD命令向名为runoobkey的集合插入三个元素
Redis集合命令
序号 | 命令及描述 |
---|---|
1 | SADD key member1 [member2] 向集合添加一个或多个成员 |
2 | SCARD key 获取集合的成员数 |
3 | SDIFF key1 [key2] 返回第一个集合与其他集合之间的差异 |
4 | SDIFFSTORE destination key1 [key2] 返回给定所有集合的差并存储在destination中 |
5 | SINTER key1 [key2] 返回给定所有集合交集 |
6 | SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在destination中 |
7 | SISMEMBERS key member 判断member元素是否是集合key的成员 |
8 | SMEMBERS key 返回集合中所有成员 |
9 | SMOVE source destination member 将member元素从source集合移动到destination集合 |
10 | SPOP key 移除并返回集合中的一个随机元素 |
11 | SRANDMEMBER key [count] 返回集合中一个或多个随机数 |
12 | SREM key member1 [member2] 移除集合中一个或多个成员 |
13 | SUNION key1 [key2] 返回所有给定集合的并集 |
14 | SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在destination集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素 |
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1).集合的最大成员数是2^32-1(4294967295,每个集合存储40多亿个成员)
实例
127.0.0.1:6379> ZADD runoobkey 1 redis
1
127.0.0.1:6379> ZADD runoobkey 2 mongodb
1
127.0.0.1:6379> ZADD runoobkey 3 mysql
1
127.0.0.1:6379> ZADD runoobkey 3 mysql
0
127.0.0.1:6379> ZADD runoobkey 4 mysql
0
127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
redis
1
mongodb
2
mysql
4
127.0.0.1:6379>
在以上实例中我们通过ZADD命令向redis的有序集合中添加了三个值并关联分数。
Redis有序集合命令
序号 | 命令及描述 |
---|---|
1 | ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 | ZCARD key 获取有序集合的成员 |
3 | ZCOUNT key min max 计算在有序集合中指定区间分数的成员数 |
4 | ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment |
5 | ZINTERSTORE destination numkeys key[key...] 计算给定的一个或多个有序集的交集并将结果存储在新的有序集合destination中 |
6 | ZLEXCOUNT key min max 在有序集合中计算指定字典内区间内的成员 |
7 | ZRANGE key start stop [WITHSCORES] 通过索引返回有序集合指定区间的成员 |
8 | ZRANGEBYLEX key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 |
9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 |
10 | ZRANK key member 返回有序集合中指定成员的索引 |
11 | ZREM key member [member...] 移除有序集合中的一个或多个成员 |
12 | ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的索引成员 |
13 | ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员 |
14 | ZREMRANGEBYSCORE key min max 移除有序集合中给定的排名分数区间的所有成员 |
15 | ZREVRANGE key start stop [WITHSCORES] 返回有序集合中指定区间内的成员,通过索引,分数从高到低。 |
16 | ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序 |
17 | ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
18 | ZSCORE key member 返回有序集中,成员的分数值 |
19 | ZUNIONSTORE destionation numskeys key [key...] 计算给定的一个或多个有序集的并集,并存储在新的key中 |
20 | ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值) |
可以用来实现朋友的定位,附近的人,打车距离计算等,它只有六个命令
注意:此功能为3.2之后的版本
城市经纬度查询: http://www.jsons.cn/lngcode/
GEOADD
添加地理位置,格式:GEOADD key 纬度 经度 名称
#两极无法直接添加 127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 106.50 29.53 chongqing 114.05 22.52 shengzhen
(integer) 2
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
GEOPOS
返回给定名称的纬度和经度
127.0.0.1:6379> GEOPOS china:city xian
1) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEOPOS china:city xian beijing
1) 1) "108.96000176668167114"
2) "34.25999964418929977"
2) 1) "116.39999896287918091"
2) "39.90000009167092543"
GEODIST
返回两个给定位置之间的距离
单位:m(米),km(千米),mi(英里),ft(英尺)
127.0.0.1:6379> GEODIST china:city beijing xian km
"910.0565"
127.0.0.1:6379> GEODIST china:city hangzhou xian km
"1143.6295"
GEOHASH
返回一个11个字符的GEOHASH字符串
127.0.0.1:6379> GEOHASH china:city xian
1) "wqj6zky6bn0" #指定元素的纬度和经度的字符串
GEORADIUS
以给定的纬度经度为中心,找到某一半径内的元素
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379>
GEORAIUSBYMEMBER
以一个成员为中心,查找指定半径范围内容的元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 1000 km
1) "xian"
2) "chongqing"
3) "beijing"
geo的底层就是一个zset集合
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city shanghai (integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "beijing"
Redis在2.8.9版本添加了Hyperloglog结构。
Redis HyperLoglog是用来做基数统计的算法,优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的,并且是很小的。
在Redis里面,每个Hyperloglog键只需花费12kb内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为Hyperloglog只会根据输入元素来计算基数,而不会存储元素本身,所以HyperLoglog不能像集合那样,返回输入的各个元素
什么是基数?
比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5。基数估计就是在误差可接受的范围内快速计算基数
实例
127.0.0.1:6379> PFADD runoobkey "redis"
1
127.0.0.1:6379> PFADD runoobkey "mongodb"
1
127.0.0.1:6379> PFADD runoobkey "mysql"
1
127.0.0.1:6379> PFCOUNT runoobkey
3
127.0.0.1:6379>
Redis Hyperloglog命令
序号 | 命令及描述 |
---|---|
1 | PFADD key element [element...] 添加指定元素到Hyperloglog中 |
2 | PFCOUNT key [key...] 返回给定Hyperloglog的基数估算值 |
3 | PFMERGE destkey soucrekey [sourcekey...] 将多个Hyperloglog合并为一个Hyperloglog |
bitmaps是位图存储的,都是二进制位来进行记录, 所以只要是只有两种状态值的场景,都可以使用bitmaps来存储。比如:登录、未登录;打卡,未打卡;活跃,不活跃等。
SETBIT
在bitmaps中添加数据,格式:SETBIT key offset value
127.0.0.1:6379> SETBIT sign 0 1
0
127.0.0.1:6379> SETBIT sign 1 1
0
127.0.0.1:6379> SETBIT sign 2 1
0
127.0.0.1:6379> SETBIT sign 3 1
0
127.0.0.1:6379> SETBIT sign 4 0
0
127.0.0.1:6379> SETBIT sign 5 0
0
127.0.0.1:6379> SETBIT sign 6 0
0
127.0.0.1:6379>
GETBIT
查看位图中某个位置的值,格式:GETBIT key offset
127.0.0.1:6379> GETBIT sign 4
0
127.0.0.1:6379> GETBIT sign 3
1
127.0.0.1:6379>
BITCOUNT
统计位图中value等于1的个数,格式BITCOUNT key start end
127.0.0.1:6379> BITCOUNT sign 0 -1
4
127.0.0.1:6379>