02Redis的基本数据类型
文章目录
Redis支持五种数据类型:
string(字符串)
,hash(哈希)
,list(列表)
,set(集合)
及zset(sorted set:有序集合)
等
1、Redis键key
Redis键命令用于管理redis的键
1.1、常用命令
命令 | 作用 |
---|---|
DEL Key |
在key存在时删除key |
DUMP KEY |
序列化给定key,并返回被序列的值 |
EXISTS key |
检查给定key是否存在 |
EXPIRE key seconds |
为给定key设置过期时间(以秒级) |
EXPIRE key milliseconds |
设置key的过期时间以毫秒计 |
TTL key |
以秒为单位,返回给定key的剩余生存时间(TTL:time to live) |
PERSIST key |
移除key的过期时间,key将持久保持 |
KEYS pattern |
查找所有符合给定模式(pattern)的key |
RENAME key newkey |
修改key的名称 |
MOVE key db |
将当前数据库的key移动到给定的数据库db当中 |
Type key |
返回key锁存储的值的类型 |
1.2、应用场景
1.3、key的命名建议
redis单个key 存入512M大小
1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2.key也不要太短,太短的话,key的可读性会降低;
3.在一个项目中,key最好使用统一的命名模式,例如user:123:password;
4.key名称区分大小写
2、Redis基本数据类型之String
2.1、介绍
string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来
二进制安全特点
- 编码、解码发生在客户端完成,执行效率高
- 不需要频繁的编解码,不会出现乱码
2.2、常用命令
设置key
SET KEY_NAME VALUE
:Redis SET 命令用于设置给定 key 的值。如果 key 已经存储值, SET 就覆写旧值,且无视类型
SETNX key value
: 解决分布式锁 方案之一,只有在key 不存在的时设置keym
MSET key value [key value....]
:同时设置一个或多个key-value对
获取key
get key_name
:Redis get命令用于获取指定key的值,如果key不存在,返回null,如果key存储的值不是字符串类型,返回一个错误
GETRANGE key start end
:用于获取存储在指定key中字符串的子字符串。字符串的截取范围由start
和end
两个偏移量决定(包括start
和end
在内)
MGET key1 [key2.......]
:获取所有(一个或多个)给定key的值
Strlen key
:返回key所存储的字符串值的长度
DEL key_name
:删除指定的key,如果存在,返回值数字类型
自增/自减
INCR KEY_Name
:Incr命令将key中存储的数字值增1。如果key
不存在,那么key
的值会先被初始化为0,然后再执行INCR
操作
INCRBY KEY_Name 增量值
:Incrby命令将key中存储的数字加上指定的增量值
DECR KEY_NAME 或 DECYBY key_name 减值
:decR命令将key中存储的数字减1
字符串拼接 APPEND key_name value
:append 命令用于为指定的key追加追末尾,如果不存在,为其赋值。
2.3、String类型的应用场景
- String通常用于保存单个字符串或JSON字符串数据
- 因为String是二进制安全的,所以完全把一个图片文件的内容作为字符串来存储
- 技术器(常用key-value缓存应用,常规计数:微博数、缓存数)
INCR
等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、
INCRBY、DECR、DECRBY等指令来实现原子计数的效果。假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。
不少网站都利用redis的这个特性来实现业务上的统计计数需求。
3、Redis基本数据类型之Hash
3.1、介绍
Redis hash
是一个string
类型的field
和value
的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
可以看成具有KEY
和VALUE
的MAP
容器,该类型非常适合于存储值对象的信息,
如:uname,upass,age等。该类型的数据仅占用很少的磁盘空间(相比于JSON)
3.2、命令
赋值语句
HSET KEY FIELD VALUE
: 为指定的Key,设置filed/valueHMSET KEY FILED VALUE [FIELD VALUE]
:同时将多个field-value(域-值)
对设置到哈希表key中
取值语句
HGET KEY FIELD
:获取存储在hASh中的值,根据FIELD
得到value
HMGET key field[field1]
:返回key所有给定字段的值
HGETALL key
:返回HASH表中所有的字段的值
HKEYS key
:获取所有哈希表中的字段
HLEN key
获取哈希表中字段的数量
删除语句
HDEL key field1[field2]
删除一个或多个HASH表字段
其他语法
HSETNX key field value
:只有在字段field不存在时,设置哈希表字段的值
HINCRBY key field increment
:为哈希表key中的指定字段的整数值加上增两increment
HINCRBYFLOAT key field increment
:为哈希表中key中的指定字段的浮点数值加上增量increment
HEXISTS key field
:查看哈希表key中,指定的字段是否存在
3.3、应用场景
4、Redis基本数据类型之List
4.1、介绍
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素) 类似JAVA中的
LinkedList
4.2、命令
赋值语句
LPUSH key value1[value2]
将一个或多个值插入到列表头部(从左侧添加)
RPUSH key value1[value2]
在列表中添加一个或多个值(从右侧添加)
LPUSHX key value
:将一个值插入到已存在的列表头部。如果列表不在,操作无效
RPUSHX key value
:一个值插入已存在的列表尾部(最右边)。如果列表不在,操作无效。
取值语句
LLEN key
: 获取列表长度LINDEX key index
:通过索引获取列表中的元素LRANGE key start stop
:获取列表指定范围内的元素
删除元素
LPOP key
:移除并获取列表的第一个元素(从左侧删除)
RPOP key
:移除列表的最后一个元素,返回值为移除的元素(从右侧删除)
BLPOP key1[key2] timeout
:移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BROP key1[key2] timeout
:移除并获取列表的最后一个元素,如果列表中没有元素会阻塞列表直到等待超时或发现可弹出元素为止
LTRIM key start stop
:对一个列表进行修剪(trim),就是说,让列表中只保留指定区间内的元素,不再指定区间之内的元素都将被删除
修改语法
LSET key index value
: 通过索引设置列表元素的值
LINSERT key BEFORE|AFTER world value
:在列表的元素前或之后插入元素怒,描述:将值value插入到列表key当中,位于值world之前或之后
RPOPLPUSH source destination
:移除列表的最后一个元素,并将该元素添加到另一个列表并返回
4.3、应用场景
项目常应用于:1、对数据量大的集合数据删减 2、任务队列
对数据量大的集合数据删减
列表数据显示、关注列表、粉丝列表、留言评论等。。。。分页,
热点新闻(Top5)
等利用LRANGE 还可以很方便的实现分页的功能,在博客系统中,每片博文的评论可以存入一个单独的list中
任务队列(生产者和消费者模式)
(list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序)
==任务队列介绍(生产者和消费者模式): ==
在处理Web客户端发送的命令请求时,某些操作的执行时间可能会比我们预期的更长一些,通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能能完成的操作,这种将工作交给任务处理器来执行的做法被称为任务队列(task queue)。
5、Set类型
5.1、介绍
Redis
的Set
是String
类型的无序集合
。集合成员是唯一
的,这就意味着集合中不能出现重复的数据。
- Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
- redis的集合对象set的底层存储结构特别神奇,底层使用了·
ntset
和hashtable
两种数据结构存储的,intset
我们可以理解为数组,hashtable
就是普通的哈希表(key
为set的值,value为null)。intset
内部其实是一个数组(int8_t coentents[]数组),而且存储数据的时候是有序的,因为在查找数据的时候是通过二分查找来实现的。
5.2、命令
赋值语句
SADD key member1 [member2]
向集合添加一个或多个成员
取值语法
SCARD key
:获取集合的成员数
SMEMBERS key
:返回集合中的所有成员
SISMEMBER key member
:判断member元素是否是集合key
的成员(开发中:验证是否存在判断)
SRANDMEMBER Key[count]
:返回集合中一个或多个随机数
删除语法
SREM key member1[member2]
:移除集合中一个或多个成员
SPOP key【count】
:移除并返回集合中的一个随机元素
SMOVE source destination member
:将member元素从source
集合移动到destination
集合
差集语法
SDIFF key1 [key2]
返回给定所有集合的差集合(左侧)
SDIFFSTORE destination key1 [key2]
:返回给定所有集合的差集并存储在destination
中
交集语法
SINTER key1 [key2]
返回给定所有集合的交集(共有数据)
SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
并集语法
SUNION key1 [key2]
返回所有给定集合的并集
SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
5.3、应用场景
常应用于:对两个集合间的数据[计算]进行
交集
,并集
,差集
运算
1、以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中
2、利用唯一性,可以统计访问网站的所有独立 IP
6、有序集合(sorted set) ZSET
6.1、介绍
- Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
- 有序集合的成员是唯一的,但分数(score)却可以重复。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
- ==Redis的ZSet是有序、且不重复 ==
6.2、命令
赋值语句
ZADD key score1 member1 [score2 member2]
:向有序集合添加一个或多个成员,或者更新已存在成员的分数
取值语法
ZCARD key
获取有序集合的成员数
ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
ZRANK key member
返回有序集合中指定成员的索引
ZRANGE key start stop [WITHSCORES]
: 通过索引区间返回有序集合成指定区间内的成员(低到高)
ZREVRANGE key start stop [WITHSCORES]
:返回有序集中指定区间内的成员,通过索引,分数从高到底
删除语法
del key
移除集合
ZREM key member [member ...]
:移除有序集合中的一个或多个成员
ZREMRANGEBYRANK key start stop
:移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序)
ZREMRANGEBYSCORE key min max
: 移除有序集合中给定的分数区间的所有成员
6.3、应用场景
常应用于:排行榜