当前位置:网站首页>Redis五种基本类型
Redis五种基本类型
2022-06-27 08:06:00 【小月亮6】
redis官网https://redis.io/commands可以找到所有的操作命令

Redis五种基本类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
1、String
String (字符串)
- string是redis最基本的类型,一 个key对应一个value。
- string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
- string类型是Redis最基本的数据类型,一 个redis中字符串value最多可以是512M
具体事例:
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> set k2 1234567
OK
127.0.0.1:6379> getrange k2 0 -1
"1234567"
127.0.0.1:6379> getrange k2 0 2
"123"
127.0.0.1:6379> setex k3 20 v3
OK
127.0.0.1:6379> ttl k3
(integer) 17
127.0.0.1:6379> ttl k3
(integer) 16
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> ttl k3
(integer) 7
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379> ttl k3
(integer) -2
127.0.0.1:6379> setex k1 20
(error) ERR wrong number of arguments for 'setex' command
127.0.0.1:6379> setnx k4 v4
(integer) 1
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379> setnx k1 vvvv
(integer) 0
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
127.0.0.1:6379> setrange k2 2 x
(integer) 7
127.0.0.1:6379> get k2
"12x4567"
127.0.0.1:6379> clear
127.0.0.1:6379> mset k6 v6 k7 v7 k8 v8
OK
127.0.0.1:6379> mget k6 k7 k8
1) "v6"
2) "v7"
3) "v8"
127.0.0.1:6379> msetnx k8 v8 k9 v9
(integer) 0
127.0.0.1:6379> get k9
(nil)
127.0.0.1:6379> msetnx k9 v9 k10 v10
(integer) 1
127.0.0.1:6379> mget k9 k10
1) "v9"
2) "v10"
127.0.0.1:6379> psetex k11 1000 v11
OK
127.0.0.1:6379> get v11
(nil)
127.0.0.1:6379> get k11
(nil)
127.0.0.1:6379> set k12 12
OK
127.0.0.1:6379> incr k12
(integer) 13
127.0.0.1:6379> incr k12
(integer) 14
127.0.0.1:6379> incr k12
(integer) 15
127.0.0.1:6379> incrby k12 5
(integer) 20
127.0.0.1:6379> incrby k12 5
(integer) 25
127.0.0.1:6379> set key 19.2
OK
127.0.0.1:6379> incrbyfloat key 10
"29.2"
127.0.0.1:6379> incrbyfloat key 10
"39.2"
127.0.0.1:6379> decr k12
(integer) 24
127.0.0.1:6379> decr k12
(integer) 23
127.0.0.1:6379> clear
127.0.0.1:6379> decrby k12 2
(integer) 21
127.0.0.1:6379> decrby k12 2
(integer) 19
127.0.0.1:6379> append k2 hhhhh
(integer) 12
127.0.0.1:6379> get k2
"12x4567hhhhh"
127.0.0.1:6379> setrange k2 2 ppppp
(integer) 12
127.0.0.1:6379> get k2
"12ppppphhhhh"
127.0.0.1:6379>
//给k1设置过期时间,前面setex是创建时设置过期时间
127.0.0.1:6379> expire k1 20
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 16
127.0.0.1:6379> ttl k1
(integer) 15
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379>
2、Hash
Hash (哈希)
- Redis hash是一个键值对集合。(例如:Student.name = xiaoming ,Student.age = 18 Student.gender = man)
- Redis hash是一个string类型的field和value的映射表, hash特别适合用于存储对象。(例如:Student.name = xiaoming ,Student.age = 18 Student.gender = man)
- 类似Java里面的Map<String,Object>
127.0.0.1:6379[1]> hset student name xiaoming
(integer) 1
127.0.0.1:6379[1]> hget student name
"xiaoming"
127.0.0.1:6379[1]> hmset student age 18 gender man
OK
127.0.0.1:6379[1]> hget student name
"xiaoming"
127.0.0.1:6379[1]> hget student age
"18"
127.0.0.1:6379[1]> hmget student name age gender
1) "xiaoming"
2) "18"
3) "man"
127.0.0.1:6379[1]> hlen student
(integer) 3
127.0.0.1:6379[1]> hkeys student
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379[1]> hexists student age
(integer) 1
127.0.0.1:6379[1]> hgetall student
1) "name"
2) "xiaoming"
3) "age"
4) "18"
5) "gender"
6) "man"
127.0.0.1:6379[1]> hincrby student age 2
(integer) 20
127.0.0.1:6379[1]> hincrby student age 2
(integer) 22
127.0.0.1:6379[1]> hset student english 98.5
(integer) 1
127.0.0.1:6379[1]> hincrbyfloat student english 1.0
"99.5"
127.0.0.1:6379[1]> hincrbyfloat student english 1.1
"100.6"
127.0.0.1:6379[1]> hsetnx student age 90
(integer) 0
127.0.0.1:6379[1]> hget student age
"22"
127.0.0.1:6379[1]> clear
127.0.0.1:6379[1]> hvals student
1) "xiaoming"
2) "22"
3) "man"
4) "100.6"
127.0.0.1:6379[1]> hdel student age
(integer) 1
127.0.0.1:6379[1]> hget student age
(nil)
127.0.0.1:6379[1]>
3、List
- 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 为已存在的列表添加值 |
127.0.0.1:6379[2]> lpush list01 1 2 3 4 5
(integer) 5
127.0.0.1:6379[2]> LRANGE list01 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379[2]> rpush list02 1 2 3 4 5
(integer) 5
127.0.0.1:6379[2]> LRANGE list02 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379[2]> LPOP list01
"5"
127.0.0.1:6379[2]> LPOP list02
"1"
127.0.0.1:6379[2]> RPOP list01
"1"
127.0.0.1:6379[2]> RPOP list02
"5"
127.0.0.1:6379[2]> LRANGE list01 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379[2]> LRANGE list02 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379[2]> LINDEX list01 2
"2"
127.0.0.1:6379[2]> LLEN list01
(integer) 3
127.0.0.1:6379[2]> LPUSH list03 1 1 1 1 1 1 1
(integer) 7
127.0.0.1:6379[2]> LREM list03 3 1 //删除三个1
(integer) 3
127.0.0.1:6379[2]> LRANGE list03 0 -1
1) "1"
2) "1"
3) "1"
4) "1"
127.0.0.1:6379[2]> RPUSH list04 0 1 2 3 4 5 6 7 8
(integer) 9
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
127.0.0.1:6379[2]> LTRIM list04 3 5 //截取3至5的数据
OK
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
3) "5"
127.0.0.1:6379[2]>
127.0.0.1:6379[2]> LPUSH list05 1 2 3
(integer) 3
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
3) "5"
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379[2]> RPOPLPUSH list04 list05
"5"
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379[2]>
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
127.0.0.1:6379[2]> lset list04 1 x
OK
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "x"
127.0.0.1:6379[2]>
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379[2]> LINSERT list05 before 3 java
(integer) 5
127.0.0.1:6379[2]> LINSERT list05 after 3 mysql
(integer) 6
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "5"
2) "java"
3) "3"
4) "mysql"
5) "2"
6) "1"
127.0.0.1:6379[2]>
性能总结:
- 它是一个字符串链表,left、 right都可以插入添加;
- 如果键不存在,创建新的链表;
- 如果键己存在,新增内容;
- 如果值全移除,对应的键也就消失了。
- 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
4、Set
- Redis的Set是string类型的无序集合。它是通过HashTable实现的
- 转载于:https://www.runoob.com/redis/redis-sets.html
- 集合成员是唯一的,这就意味着集合中不能出现重复的数据。和上面说的list很接近,但是需要保证唯一
- Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
| 序号 | 命令及描述 |
|---|---|
| 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 | SISMEMBER 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] 迭代集合中的元素 |
127.0.0.1:6379[3]> sadd set01 1 1 2 2 3 3
(integer) 3
(0.58s)
127.0.0.1:6379[3]> smembers set01
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]> sismember set01 1
(integer) 1
127.0.0.1:6379[3]> sismember set01 x
(integer) 0
127.0.0.1:6379[3]> scard set01
(integer) 3
127.0.0.1:6379[3]> srem set01 1
(integer) 1
127.0.0.1:6379[3]> smembers set01
1) "2"
2) "3"
127.0.0.1:6379[3]> sadd set02 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379[3]> srandmember 3
(nil)
127.0.0.1:6379[3]> srandmember set02 3
1) "6"
2) "3"
3) "2"
127.0.0.1:6379[3]> srandmember set02 3
1) "6"
2) "3"
3) "9"
127.0.0.1:6379[3]> srandmember set02 3
1) "5"
2) "8"
3) "7"
127.0.0.1:6379[3]> spop set02 2
1) "9"
2) "6"
127.0.0.1:6379[3]> smembers set02
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "8"
127.0.0.1:6379[3]>
127.0.0.1:6379[3]> sadd set03 x y z
(integer) 3
127.0.0.1:6379[3]> sadd set04 1 2 3
(integer) 3
127.0.0.1:6379[3]> smove set03 set02 x
(integer) 1
127.0.0.1:6379[3]> smembers set03
1) "y"
2) "z"
127.0.0.1:6379[3]> smembers set04
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]>
127.0.0.1:6379[3]> sadd set5 1 2 3 4 5
(integer) 5
127.0.0.1:6379[3]> sadd set6 1 2 3 a b
(integer) 5
127.0.0.1:6379[3]> sdiff set5 set6
1) "4"
2) "5"
127.0.0.1:6379[3]> sinter set5 set6
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]> sunion set5 set6
1) "a"
2) "1"
3) "b"
4) "3"
5) "5"
6) "4"
7) "2"
127.0.0.1:6379[3]>
5、zset(sorted set: 有序集合)
- Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。
- redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
在set基础上,加一个score值之前set是k1 v1 v2 v3 现在zset是k1 score1 v1 score2 v2
127.0.0.1:6379[3]> zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
(integer) 5
127.0.0.1:6379[3]> zrange zset01 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379[3]> zrange zset01 0 -1 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
9) "v5"
10) "100"
127.0.0.1:6379[3]> zrangebyscore zset01 60 90
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379[3]> zrangebyscore zset01 60 (90
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379[3]> zrangebyscore zset01 (60 90
1) "v2"
2) "v3"
3) "v4"
127.0.0.1:6379[3]> zrangebyscore zset01 (60 (90
1) "v2"
2) "v3"
127.0.0.1:6379[3]> zrangebyscore zset01 60 90 limit 2
(error) ERR syntax error
127.0.0.1:6379[3]> zrangebyscore zset01 60 90 limit 2 2
1) "v3"
2) "v4"
127.0.0.1:6379[3]>
127.0.0.1:6379[3]> zrem zset01 v5
(integer) 1
127.0.0.1:6379[3]> zrange zset01 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379[3]> zcard zset01
(integer) 4
127.0.0.1:6379[3]> zcount zset01 60 80
(integer) 3
127.0.0.1:6379[3]> zrank zset01 v4
(integer) 3
127.0.0.1:6379[3]> zscore zset01 v4
"90"
127.0.0.1:6379[3]> zrevrank zset01 v4
(integer) 0
127.0.0.1:6379[3]> zrevrange zset01 0 -1 //带有re是逆序的意思
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379[3]> zrevrangebyscore zset01 90 60
1) "v4"
2) "v3"
3) "v2"
4) "v1"
边栏推荐
- [batch dos-cmd command - summary and summary] - parameters%0,%1,%2,%[0-9],%0-9 in the batch command and batch command parameter position switching command shift, operator% usage in the DOS command
- 盲测调查显示女码农比男码农更优秀
- How can I import data from Oracle into fastdfs?
- 【12. 最大连续不重复子序列】
- The 6th Blue Bridge Cup
- UE5神通--POI解决方案
- JS performance reward and punishment examples
- 【13. 二进制中1的个数、位运算】
- js输出1-100之间所有的质数并求总个数
- Import and export database related tables from the win command line
猜你喜欢

"Short video" Linxia fire rescue detachment carries out fire safety training

游戏六边形地图的实现

Associated GIS: all roads lead to ue5 City

The IPO of Yefeng pharmaceutical was terminated: Yu Feng, the actual controller who had planned to raise 540million yuan, made P2P investment

Lvgl description 3 about the use of lvgl Guide

SIG associé: toutes les routes mènent à ue5

Index +sql exercise optimization

参考 | Win11 开启热点之后电脑不能上网

Implementation of game hexagon map

【13. 二进制中1的个数、位运算】
随机推荐
js打印99乘法表
[12. maximum continuous non repeating subsequence]
淘宝虚拟产品开店教程之作图篇
盲测调查显示女码农比男码农更优秀
什么是期货反向跟单?
What is a flotation machine?
关于放大器失真的原因你了解多少呢?
Zabbix部署说明(Server+Win客户端+交换机(H3C))
【13. 二进制中1的个数、位运算】
js输出1-100之间所有的质数并求总个数
第6届蓝桥杯
Preliminary understanding of C #
(笔记)Anaconda-Navigator闪退解决方法
c的时间函数算效率
Lvgl description 3 about the use of lvgl Guide
Error in idea connection database
Cookie encryption 7 fidder analysis phase
No matter how good LCD and OLED display technologies are, they cannot replace this ancient display nixie tube
MySQL about auto increment sum cannot be empty
JS, and output from small to large