二、Redis五大数据类型详细讲解

在这里插入图片描述

常规五大数据类型

一、字符串(strings)

这是最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)。
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象(一个redis中字符串value最多可以是512M)。

对 key 的增删改查操作
127.0.0.1:6379> set key1 value1				# 设置值
OK

127.0.0.1:6379> get key1					# 读取值
"value1"

127.0.0.1:6379> keys *						# 获取所有的键
key1

127.0.0.1:6379> del key1					# 删除键
1

127.0.0.1:6379> exists key1					# 判断某个key是否存在(存在返回1, 不存在返回0)
1
127.0.0.1:6379> exists key2
0

127.0.0.1:6379> expire key1 60				# 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
1

127.0.0.1:6379> ttl key1					# 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期 
56

127.0.0.1:6379> type key1					# 查看你的key是什么类型
string

127.0.0.1:6379> append key1 val1			# 对不存在的 key 进行 APPEND ,等同于 SET key1 "val1"
4
127.0.0.1:6379> get key1
val1

127.0.0.1:6379> append key1 '-append'		# APPEND key1 "-append" # 对已存在的字符串进行 APPEND 操作
11
127.0.0.1:6379> get key1
val1-append

127.0.0.1:6379> strlen key1					# 获取字符串的长度
11

虽然字符串是Redis的基本值类型,但你仍然能通过它完成一些有趣的操作。例如:原子递增:

# INCR 命令将字符串值解析成整型,会将键值对中的值在原有的基础上 “+1”
127.0.0.1:6379> set counter 10
OK
127.0.0.1:6379> incr counter
11
127.0.0.1:6379> incr counter
12
127.0.0.1:6379> incr counter
13
127.0.0.1:6379>

既然有“+1”的操作, 想必必然有“-1”的操作, “-1”的操作使用decr

127.0.0.1:6379> decr counter
12
127.0.0.1:6379> decr counter
11
127.0.0.1:6379> decr counter
10

使用 incrby 命令将 key 中储存的数字加上指定的增量值。

127.0.0.1:6379> incrby counter 10
20
127.0.0.1:6379> incrby counter 10
30

相反的 , 使用 decrby 命令将 key 中储存的数字加上指定的减量值。

127.0.0.1:6379> decrby counter 10
20
127.0.0.1:6379> decrby counter 10
10

incrbydecrby 可以用来记录文章浏览量, 评论数,转发数等等, 然后在一定的时间内更新到数据库即可,而并不需要, 浏览一次就更新一次, 这在一定程度上可以减少数据库的压力。

拓展: 插入数据为中文,读取会有问题,例如:

127.0.0.1:6379> set key1 值1
OK
127.0.0.1:6379> get key1
"\xe5\x80\xbc1"
127.0.0.1:6379> 

可以看到, 当我们插入中文的时候, 返回的是\xe5\x80\xbc1类似的编码格式,这个时候需要我们使用--raw 来启动redis 客户端,这样就可以解决读取中文乱码的问题

[root@TR ~]# redis-cli -p 6379 --raw
127.0.0.1:6379> get key1
值1
127.0.0.1:6379>
常用语法:
redis 127.0.0.1:6379> DBSIZE         # 0 号数据库的 key 数量
(integer) 9
redis 127.0.0.1:6379> SELECT 1       # 切换到 1 号数据库
OK
redis 127.0.0.1:6379> flushall       # 清空所有数据库的所有 key
OK
redis 127.0.0.1:6379> flushdb        # 清空当前数据库的所有 key
OK

二、散列(hashes)

Redis hash 是一个键值对集合。Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。
类似C#里面的Dictionary<Object,Object>

hashes 是 kv模式不变,但V是一个键值对

# ===================================================
# hset、hget 命令用于为哈希表中的字段赋值 。
# hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。
# hgetall 用于返回哈希表中,所有的字段和值。
# hdel 用于删除哈希表 key 中的一个或多个指定字段
# ===================================================

127.0.0.1:6379> hset myhash key1 value1 key2 value2 key3 value3    # 设置值(可以同时设置多个)
(integer) 3
127.0.0.1:6379> hget myhash key2								   # 读取值
"value2"
127.0.0.1:6379> hgetall myhash									   # 用于返回哈希表中,所有的字段和值
1) "key1"
2) "value1"
3) "key2"
4) "value2"
5) "key3"
6) "value3"
127.0.0.1:6379> hdel myhash key1					   		       # 删除指定的key
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "key2"
2) "value2"
3) "key3"
4) "value3"
127.0.0.1:6379> hlen myhash										   # 获取hash 的长度
(integer) 2
127.0.0.1:6379> hexists myhash key1								   #  hexists 查看哈希表的指定字段是否存在
(integer) 0
127.0.0.1:6379> hkeys myhash									   # hkeys 获取哈希表中的所有域(field)
1) "key2"
2) "key3"
127.0.0.1:6379> hvals myhash									   # hvals 返回哈希表所有域(field)的值。
1) "value2"
2) "value3"


127.0.0.1:6379> hset myhash  field 5							   # hincrby 为哈希表中的字段值加上指定增量值
(integer) 1
127.0.0.1:6379> hincrby myhash field 1
(integer) 6
127.0.0.1:6379> hincrby myhash field 1
(integer) 7
127.0.0.1:6379> hincrby myhash field -5							  # hincrby 为哈希表中的字段值加上指定减量值
(integer) 2

127.0.0.1:6379> HSETNX myhash field1 "hello"					  # hsetnx 为哈希表中不存在的的字段赋值 。
(integer) 1 # 设置成功,返回 1 。
127.0.0.1:6379> HSETNX myhash field1 "world"
(integer) 0 # 如果给定字段已经存在,返回 0 。
127.0.0.1:6379> HGET myhash field1
"hello"

三、列表(lists)

Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

# ===================================================
# Lpush:将一个或多个值插入到列表头部。(左)
# rpush:将一个或多个值插入到列表尾部。(右)
# lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
# 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
# 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
# ===================================================

127.0.0.1:6379> lpush mylist one									# 将一个或多个值插入到列表头部。(左)
(integer) 1
127.0.0.1:6379> lpush mylist two
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1									# 查询列表中所有元素
1) "two"
2) "one"
127.0.0.1:6379> rpush mylist three								    # 将一个或多个值插入到列表尾部。(右)
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1									#  可以看到数据的顺序发生了变化
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> 

# ===================================================
# lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。
# rpop 移除列表的最后一个元素,返回值为移除的元素。
# ===================================================

127.0.0.1:6379> lpop mylist
"two"
127.0.0.1:6379> lrange mylist 0 -1
1) "one"
2) "three"
127.0.0.1:6379> rpop mylist
"three"
127.0.0.1:6379> lrange mylist 0 -1
1) "one"

# ===================================================
# Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
# ===================================================
127.0.0.1:6379> Lindex list 1
(nil)
127.0.0.1:6379> Lindex list 0
"one"
127.0.0.1:6379> Lindex list -1
"one"

# ===================================================
# llen 用于返回列表的长度。
# ===================================================
127.0.0.1:6379> Llen list 									# 返回列表的长度
(integer) 1

拓展
list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列

四、集合(sets)

Redis的Set是String类型的无序集合,它是通过HashTable实现的 !

# ===================================================
# sadd 将一个或多个成员元素加入到集合中,不能重复
# smembers 返回集合中的所有的成员。
# sismember 命令判断成员元素是否是集合的成员。
# ===================================================
127.0.0.1:6379> sadd myset v1
(integer) 1
127.0.0.1:6379> sadd myset v2
(integer) 1
127.0.0.1:6379> sadd myset v3
(integer) 1
127.0.0.1:6379> smembers myset
1) "v3"
2) "v1"
3) "v2"
127.0.0.1:6379> sismember myset v2
(integer) 1
127.0.0.1:6379> sismember myset v11
(integer) 0

# ===================================================
# scard,获取集合里面的元素个数
# ===================================================
127.0.0.1:6379> scard myset
(integer) 3

# ===================================================
# srem key value 用于移除集合中的一个或多个成员元素
# ===================================================
127.0.0.1:6379> srem myset v2
(integer) 1
127.0.0.1:6379> smembers myset
1) "v3"
2) "v1"

# ===================================================
# srandmember key 命令用于返回集合中的一个随机元素。
# 可以自定义返回几个随机元素
# ===================================================
127.0.0.1:6379> srandmember myset
"v1"
127.0.0.1:6379> srandmember myset
"v3"
127.0.0.1:6379> srandmember myset 2
1) "v3"
2) "v1"
127.0.0.1:6379> 

# ===================================================
# spop key 用于移除集合中的指定 key 的一个或多个随机元素
# ===================================================
127.0.0.1:6379> SMEMBERS myset
1) "v3"
2) "v1"
127.0.0.1:6379> spop myset
"v3"
127.0.0.1:6379> SMEMBERS myset
1) "v1"


# ===================================================
# smove SOURCE DESTINATION MEMBER
# 将指定成员 member 元素从 source 集合移动到 destination 集合。
# ===================================================
127.0.0.1:6379> sadd myset1 v1
(integer) 1
127.0.0.1:6379> sadd myset1 v2
(integer) 1
127.0.0.1:6379> sadd myset1 v3
(integer) 1
127.0.0.1:6379> sadd myset2 v4
(integer) 1
127.0.0.1:6379> sadd myset2 v5
(integer) 1
127.0.0.1:6379> sadd myset2 v6
(integer) 1
127.0.0.1:6379> smembers myset1
1) "v3"
2) "v1"
3) "v2"
127.0.0.1:6379> smembers myset2
1) "v6"
2) "v5"
3) "v4"
127.0.0.1:6379> smove myset1 myset2 v1
(integer) 1
127.0.0.1:6379> smembers myset1
1) "v3"
2) "v2"
127.0.0.1:6379> smembers myset2
1) "v6"
2) "v1"
3) "v5"
4) "v4"
127.0.0.1:6379> 


# ===================================================
# 数字集合类
# 差集: sdiff
# 交集: sinter
# 并集: sunion
# ===================================================

127.0.0.1:6379> smembers myset1				# 查询集合myset1 的成员
1) "v3"
2) "v1"
3) "v5"
4) "v2"
127.0.0.1:6379> smembers myset2				# 查询集合myset2 的成员
1) "v6"
2) "v1"
3) "v5"
4) "v4"
127.0.0.1:6379> sdiff myset1 myset2			# 差集
1) "v3"
2) "v2"
127.0.0.1:6379> sinter myset1 myset2		# 交集
1) "v1"
2) "v5"
127.0.0.1:6379> sunion myset1 myset2		# 并集
1) "v3"
2) "v6"
3) "v4"
4) "v1"
5) "v5"
6) "v2"
127.0.0.1:6379> 

Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

五、有序集合(sorted sets)

Redis zset 和 set 一样,也是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。
Redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但是分数(Score)却可以重复。

# ===================================================
# zadd 将一个或多个成员元素及其分数值加入到有序集当中。
# zrange 返回有序集中,指定区间内的成员
# ===================================================
127.0.0.1:6379> zadd myset 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"

# ===================================================
# zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
# ===================================================
127.0.0.1:6379> zrangebyscore myset -inf +inf	# Inf无穷大量+∞,同样地,-∞可以表示为-Inf。				
1) "one"
2) "two"
3) "three"

# 递增排列
127.0.0.1:6379> zrangebyscore myset -inf +inf withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

# 递减排列
127.0.0.1:6379> zrevrange myset  0 -1 withscores
1) "three"
2) "3"
3) "two"
4) "2"
5) "one"
6) "1"

# 所有集合 <= 2的所有成员
127.0.0.1:6379> zrangebyscore myset  -inf 2 withscores
1) "one"
2) "1"
3) "two"
4) "2"

# ===================================================
# zrem 移除有序集中的一个或多个成员
# ===================================================
127.0.0.1:6379> zrem myset two
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "three"

# ===================================================
# zcard 命令用于计算集合中元素的数量。
# ===================================================
127.0.0.1:6379> zcard salary
(integer) 2
OK

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。排行榜应用,取TOP N操作 !

Redis 系列文章

Linux、windows 下安装Redis图文教程
一、为什么要是用Redis?
二、Redis五大数据类型详细讲解
三、Redis.conf 配置文件详细介绍
四、Redis 的持久化(RDB、AOF)
五、Redis事务的详细介绍
七、Redis 主从复制以及哨兵模式的详细图解
八、Sentinel.conf 配置文件详细介绍
九、Redis的缓存穿透和雪崩问题,以及解决方案
整理了一些关于 Redis的高频面试题【建议收藏】

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖太乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值