redis五种数据结构
- 1. redis 其他相关
- 1.1 redis 的安装
- 1.2 redis 的持久化
- 1.3 redis 配置文件
- 2. redis 常见命令
- 2.1 key
- 2.2 设置 key 的生存时间或过期时间
- 3. redis的5种常见的数据结构
- 3.1 String
- 3.2 list
- 3.3 hash
- 3.4 set
- 3.5 zset(SortedSet(有序集合))
- 3.6 更多操作命令参考
- 4. 常见问题
- 4.1 中文显示16进制编码问题
- 4.2
- 5.
1. redis 其他相关
1.1 redis 的安装
- Linux下安装redis以及解决各种安装与启动问题.
安装如果需指定安装目录,可以在make install
时,使用PREFIX 指定目录,如下:make install PREFIX=/susu/soft/mkinstall/redis/redis-6.0.4/
- mac上安装redis的两种方法.
1.2 redis 的持久化
- 简单谈谈 redis 持久化(RDB 和 AOF).
1.3 redis 配置文件
- 简单说说redis配置文件中的一些配置.
2. redis 常见命令
2.1 key
- ①
keys
语法:KEYS pattern
查找所有符合给定模式 pattern 的 key ,其中keys *
是匹配数据库内所有 key。如图:
- ②
type
语法:TYPE key
,返回 key 所储存的值的类型。
- ③
del
语法:DEL key [key ...]
,删除给定的一个或多个 key ,不存在的 key 会被忽略。
- ④
EXISTS
语法:EXISTS key
检查给定 key 是否存在。 - ⑤
2.2 设置 key 的生存时间或过期时间
- 为给定 key 设置生存时间(即:设置过期时间:(expire time))
expire key seconds
- 查看还有多少秒过期(生存时间:(Time To Live, TTL))
ttl key
- 其中
-1
表示永不过期 - 其中
-2
表示已经过期,已经过期的 key 会被自动删除
- 其中
- 简单实例:
3. redis的5种常见的数据结构
- 对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种。
类型常量 | 对象的名称 | type命令输出 |
---|---|---|
REDIS_STRING | 字符串对象 | string |
REDIS_LIST | 列表对象 | list |
REDIS_HASH | 哈希对象 | hash |
REDIS_SET | 集合对象 | set |
REDIS_ZSET | 有序集合对象 | zset |
3.1 String
- 常用命令:
-
- 添加/修改数据:
set key value
- 添加/修改数据:
-
- 获取数据:
get key
- 获取数据:
-
- 删除数据:
del key
- 删除数据:
-
- 添加/修改多个数据:
mset key1 valueq key2 value2 …
- 添加/修改多个数据:
-
- 获取多个数据:
mget key1 key2 …
- 获取多个数据:
-
- 获取数据字符个数(字符串长度):
strlen key
- 获取数据字符个数(字符串长度):
-
- 追加信息到原始信息后部(如果原始信息存在就追加,否则新建):
append key value
- 追加信息到原始信息后部(如果原始信息存在就追加,否则新建):
- 如下:
3.2 list
- 常用命令如下:
-
lpush key value [value ...]
将一个或多个值 value 插入到列表 key 的表头(即:从左边插入)。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
-
-
rpush key value [value ...]
将一个或多个值 value 插入到列表 key 的表尾(最右边
)。如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
rpush numbers 1 rpush names "zhang san" "li si" "wangwu" "zhang san" "lily" "lucy"
-
-
-
LPUSHX key value
将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。和
LPUSH
命令相反,当 key 不存在时, LPUSHX 命令什么也不做。
-
-
-
rpushx key value
将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。和 RPUSH 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。
-
-
-
lrange key start stop
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
lrange numbers 0 3
-
-
-
LREM key count value
根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
-
- 简单测试例子如下:
3.3 hash
- 常用命令如下:
-
-
hset
(可以同时设置多个 field value)HSET key field value
将哈希表 key 中的域 field 的值设为 value 。
如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
如果域 field 已经存在于哈希表中,旧值将被覆盖。
hset person_1 name "lucy" hset person_1 age 18 sex "女"
-
-
-
hget
HGET key field
返回哈希表 key 中给定域 field 的值。
hget person_1 name
-
-
-
hgetall
hgetall key
返回哈希表 key 中,所有的域和值。
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
hgetall person_1
-
-
-
hkeys
hkeys key
返回哈希表 key 中的所有域。
hkeys person_1
-
-
-
hvals
hvals key
返回哈希表 key 中所有域的值。
hvals person_1
-
-
-
hexists
hexists key field
查看哈希表 key 中,给定域 field 是否存在。
hexists person_1 name
-
-
-
HSETNX
HSETNX key field value
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
若域 field 已经存在,该操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。
-
-
-
hmset
(注意:这个功能 hset 也是可以做到的)HMSET key field value [field value ...]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
此命令会覆盖哈希表中已存在的域。
如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
hmset dog_1 name "maidou" age 2
-
-
-
hmget
HMGET key field [field ...]
返回哈希表 key 中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个 nil 值。
因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
hmget dog_1 name age
-
- 简单测试如下:
3.4 set
- 常用命令如下:
-
-
sadd
SADD key member [member ...]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略(即:添加的元素不重复)。
假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
当 key 不是集合类型时,返回一个错误。
-
-
-
smembers
SMEMBERS key
返回集合 key 中的所有成员。
不存在的 key 被视为空集合。
-
-
-
srem
SREM key member [member ...]
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
当 key 不是集合类型,返回一个错误。
srem colour yellow
-
- 简单例子如下:
3.5 zset(SortedSet(有序集合))
常用命令如下:
-
zadd
ZADD key score member [[score member] [score member] ...]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
zadd pet_rank 3 "cat" 1 dog zadd pet_rank 2 bird
-
zrange
zrange key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序(lexicographical order )来排列。
如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。zrange pet_rank 0 -1 withscores zrange pet_rank 1 2 withscores zrange pet_rank 0 -2 withscores
-
zrank
ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
==排名以 0 为底,也就是说, score 值最小的成员排名为 0 ==。
使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。
3.6 更多操作命令参考
- https://www.redis.net.cn/tutorial/3501.html.
4. 常见问题
4.1 中文显示16进制编码问题
-
先看下面的例子
127.0.0.1:6379> set user7_json {“userName”:”nicai”,”userAge”:”100”} OK 127.0.0.1:6379> set user8_json '{"userName":"nicai","userAge":"100"}' OK 127.0.0.1:6379> set nicai1 nicai OK 127.0.0.1:6379> set nicai2 你猜
要想中文能正常显示,两种查看方法: -
- ① 常用的:连接的时候加上
--raw
redis-cli -p 6379 -a redis --raw
- ① 常用的:连接的时候加上
-
- ② 来个稍微奇怪的写法,用
echo
echo `redis-cli -a redis get nicai2`
- ② 来个稍微奇怪的写法,用