Redis数据类型及命令

文章目录

  • Redis数据类型
  • Redis键(key)
  • Redis字符串(String)
  • Redis哈希(Hash)
  • Redis列表(List)
  • Redis集合(Set)
  • Redis有序集合(sorted set)
  • Redis的三种特殊类型
    • geospatial 地理空间
    • hyperLoglog
    • bitmaps

Redis数据类型

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数据类型及命令_第1张图片
实例中我们使用了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键(key)

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字符串(String)

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 decrementkey所存储的值减去给定的减量值(decrement)
20 APPEND key value如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值(value)末尾。

Redis哈希(Hash)

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列表(List)

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)

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有序集合(sorted set)

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]迭代有序集合中的元素(包括元素成员和元素分值)

Redis的三种特殊类型

geospatial 地理空间

可以用来实现朋友的定位,附近的人,打车距离计算等,它只有六个命令

注意:此功能为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"

hyperLoglog

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是位图存储的,都是二进制位来进行记录, 所以只要是只有两种状态值的场景,都可以使用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>

你可能感兴趣的:(#,NoSQL,数据库,nosql,redis)