一文了解:Redis基础类型
Redis基础类型
Redis特点
开源的,BSD许可高级的key-value存储系统
可以用来存储字符串,哈希结构,链表,集合
安装
windows:https://github.com/microsoftarchive/redis/releases
mac\linux:http://www.redis.cn/
Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。
string(字符串)
字符串类型是Redis的最基本数据结构。
字符串类型的值实际可以为字符串,数字,二进制,但是值最大不能超过512M。
key value
hello world
counter 1
bits 10000100
json {"id":1,"name":"xiaocai","age":18}
string命令
设置
set key value [EX seconds] [PX milliseconds] [NX|XX]
get key
set
name xiaocai
OK
get
name
"xiaocai"
过期
setex key seconds value
set
name1 redis1 ex
10
10秒后过期
OK
get
name1
(
nil
)
setex name2
10
redis2
10秒后过期
OK
get
name2
"redis2"
get
name2
(
nil
)
set
name3 redis3 px
10
10豪秒后过期
OK
get
name3
(
nil
)
不存在才能设置成功或者必须存在才能设置成功
set
hello world nx
不存在才能设置成功
OK
set
hello w nx
存在就设置失败
(
nil
)
get
hello
"world"
set
hello w xx
存在才能设置成功
OK
set
world hello xx
不存在就设置失败
(
nil
)
get
hello
"w"
get
world
(
nil
)
批量设置
mset key value
[
key value
...]
mget key
[
key
...]
mset name1 redis1 name2 redis2
OKmget name1 name2
1
)
"redis1"
2
)
"redis2"
mget name1 name2 name3
1
)
"redis1"
2
)
"redis2"
3
)
(
nil
)
计数
incr key
incrby key increment
set
age
18
value只能为整数
OK
incr age
(
integer
)
19
incrby age
- 5
(
integer
)
14
incrby age
10
(
integer
)
24
删除
del key [key ...]
del
age
(
integer
)
1
get
age
(
nil
)
内部编码
int 8个字节的长整型
embstr 小于等于39个字节的字符串
raw 大于39个字节的字符串
set
port
6379
OK
object
encoding port
"int"
set
hello world
OK
object
encoding hello
"embstr"
set
longString abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
OK
object
encoding hello
"raw"
strlen longString
(
integer
)
52
list(列表)
list类型是用来存储多个有序的字符串。每列字符串称之为元素。一个list的最大存储为2^32-1个元素。可以对列表进行双端插入和弹出,也可以指定索引下标获取元素。
列表
list命令
头部和尾部添加元素
lpush key value [value ...]
rpush key value [value ...]
lrange key start stop
lpush letter
"a"
(
integer
)
1
lpush letter
"b"
(
integer
)
2
lpush letter
"c"
(
integer
)
3
lrange letter
0
- 1
1
)
"c"
2
)
"b"
3
)
"a"
rpush letter
"a"
(
integer
)
4
rpush letter
"b"
(
integer
)
5
rpush letter
"c"lrange letter
0
- 1
1
)
"c"
2
)
"b"
3
)
"a"
4
)
"a"
5
)
"b"
6
)
"c"
头部和尾部弹出元素
lpop key
rpop key
lpop letter
"c"lpop letter
"b"lrange letter
0
- 1
1
)
"a"
2
)
"a"
3
)
"b"
4
)
"c"
rpop letter
"c"rpop letter
"b"lrange letter
0
- 1
1
)
"a"
2
)
"a"
索引操作
索引需要对全部list进行遍历,性能会随着元素个数的增大而变差
lrange key start stop
lindex key index
ltrim key start stop
len key
rpush letter b c
(
integer
)
4
lrange letter
0
- 1
1
)
"a"
2
)
"a"
3
)
"b"
4
)
"c"
lindex letter
2
"b"ltrim letter
0
2
OKlrange letter
01
1
)
"a"
2
)
"a"
3
)
"b"
llen letter
(
integer
)
3
插入
insert key BEFORE|AFTER pivot value
linsert letter before b c
(
integer
)
4
linsert letter after a d
(
integer
)
5
lrange letter
0
- 1
1
)
"a"
2
)
"d"
3
)
"a"
4
)
"c"
5
)
"b"
修改
set key index value
lset letter
2
B
OKlrange letter
0
- 1
1
)
"a"
2
)
"d"
3
)
"B"
4
)
"c"
5
)
"b"
内部编码
ziplist(压缩列表):小于3.2版本,当元素个数小于list-max-ziplist-entries配置(默认512个),同时每个元素的值长度都小于list-max-ziplist-value配置(默认64字节)
linkedlist(链表):小于3.2版本,不满足ziplist的条件
quicklist:Redis 3.2版本,以一个ziplist为节点的linkedlist
object
encoding letter
"quicklist"
hash (哈希)
hash是一个string类型的field和value的映射表。 它适合用于存储对象,它是无序的,不能使用索引操作。
哈希
hash命令
设置
hset key field value
hset user
:
1
name zhangSan
(
integer
)
1
hset user
:
1
age
18
(
integer
)
1
获取和获取所有的field-value
hget key field
hgetall key
hget user
:
1
name
"zhangSan"hgetall user
:
1
1
)
"name"
2
)
"zhangSan"
3
)
"age"
4
)
"18"
删除
hdel key field [field ...]
hdel user
:
1
age
(
integer
)
1
hdel user
:
2
age
(
integer
)
0
长度
hlen key
hlen user
:
1
(
integer
)
1
批量设置
hmset key field value [field value ...]
hmset user
:
2
name liSi age
23
OKhmget user
:
2
name age
1
)
"liSi"
2
)
"23"
hlen user
:
1
(
integer
)
1
hlen user
:
2
(
integer
)
2
是否存在
hexists key field
hexists user
:
2
name
(
integer
)
1
hexists user
:
2
city
(
integer
)
0
所有的field和所有的value
hkeys key
hvals key
hkeys user
:
1
1
)
"name"
hkeys user
:
2
1
)
"name"
2
)
"age"
hvals user
:
1
1
)
"zhangSan"
hvals user
:
2
1
)
"liSi"
内部编码
ziplist(压缩列表):当元素个数小于hash-max-ziplist-entries配置(默认512个)和每个元素大小小于hash-max-ziplist-value配置(默认64字节)时
hashtable(哈希表):不满足ziplist条件时
object
encoding user
:
1
"ziplist"
修改配置文件hash-max-ziplist-entries为5
hmset test t1 v1 t2 v2 t3 v3 t4 v4 t5 v5 t6 v6
OK
object
encoding test
"hashtable"
set(集合)
用来保存多个字符串元素,无序的,不能有重复元素,不能使用索引下标获取元素。一个集合可以存储2^32-1个元素。
集合
set命令
增加
add key member [member ...]
sadd user
:
1
:
tag it music news
(
integer
)
3
sadd user
:
1
:
tag bike news
(
integer
)
1
删除
srem key member [member ...]
srem user
:
1
:
tag bike
(
integer
)
1
个数
scard key
scard user
:
1
:
tag
(
integer
)
3
是否存在
sismember key member
sismember user
:
1
:
tag bike
(
integer
)
0
sismember user
:
1
:
tag it
(
integer
)
1
随机返回指定个数
srandmember key [count]
srandmember user
:
1
:
tag
"news"srandmember user
:
1
:
tag
3
1
)
"news"
2
)
"music"
3
)
"it"
随机弹出
spop key [count]
spop user
:
1
:
tag
"news"srandmember user
:
1
:
tag
3
1
)
"music"
2
)
"it"
所有个数
smembers key
smembers user
:
1
:
tag
1
)
"music"
2
)
"it"
交集
sinter key [key ...]
sinter user
:
1
:
tag user
:
2
:
tag
1
)
"music"
2
)
"it"
并集
sunion key [key ...]
sunion user
:
1
:
tag user
:
2
:
tag
1
)
"music"
2
)
"java"
3
)
"run"
4
)
"it"
差集
sdiff key [key ...]
sdiff user
:
1
:
tag user
:
2
:
tag
(
empty list
or
set
)
sadd user
:
1
:
tag sleep
(
integer
)
1
sdiff user
:
1
:
tag user
:
2
:
tag
1
)
"sleep"
sdiff user
:
2
:
tag user
:
1
:
tag
1
)
"java"
2
)
"run"
内部编码
intset(整数集合):元素都是整数和元素个数小于set-max-intset-entries配置(默认512个)时
hashtable(哈希表):不满足intset时
object
encoding user
:
1
:
tag
"hashtable"
sadd numbers
1
2
3
4
5
(
integer
)
5
object
encoding numbers
"intset"
zset(有序集合)
zset保证了元素不能重复,每个元素都有一个分数(score)作为排序的依据。
有序集合
zset命令
添加
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
zadd books
8.2
"Redis in Action"
(
integer
)
1
zadd books
9.3
"Effective Java: Second Edition : Java"
(
integer
)
1
zadd books
9.1
"Think in Java"
(
integer
)
1
zadd books
9.3
"Python Cookbook"
9.0
"Effective Python"
(
integer
)
2
个数
zcard key
zcard books
(
integer
)
5
升序返回范围的成员
zrange key start stop [WITHSCORES]
zrange books
0
- 1
1
)
"Redis in Action"
2
)
"Effective Python"
3
)
"Think in Java"
4
)
"Effective Java: Second Edition : Java"
5
)
"Python Cookbook"
zrange books
2
5
1
)
"Think in Java"
2
)
"Effective Java: Second Edition : Java"
3
)
"Python Cookbook"
升序返回成员时带上分数
zrange books
0
- 1
withscores
1
)
"Redis in Action"
2
)
"8.1999999999999993"
3
)
"Effective Python"
4
)
"9"
5
)
"Think in Java"
6
)
"9.0999999999999996"
7
)
"Effective Java: Second Edition : Java"
8
)
"9.3000000000000007"
9
)
"Python Cookbook"
10
)
"9.3000000000000007"
zrange books
2
5
withscores
1
)
"Think in Java"
2
)
"9.0999999999999996"
3
)
"Effective Java: Second Edition : Java"
4
)
"9.3000000000000007"
5
)
"Python Cookbook"
6
)
"9.3000000000000007"
精度问题:内部 score 使用 double 类型进行存储,所以存在小数点精度问题
withscores:带上分数
降序
zrevrange key start stop [WITHSCORES]
zrevrange books
0
- 1
withscores
1
)
"Python Cookbook"
2
)
"9.3000000000000007"
3
)
"Effective Java: Second Edition : Java"
4
)
"9.3000000000000007"
5
)
"Think in Java"
6
)
"9.0999999999999996"
7
)
"Effective Python"
8
)
"9"
9
)
"Redis in Action"
10
)
"8.1999999999999993"
指定value的score
zscore key member
zscore books
"Think in Java"
"9.0999999999999996"
根据score的数值区间升序
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
zrangebyscore books
0
9.1
withscores
1
)
"Redis in Action"
2
)
"8.1999999999999993"
3
)
"Effective Python"
4
)
"9"
5
)
"Think in Java"
6
)
"9.0999999999999996"
根据score的数值区间降序
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
zrevrangebyscore books
9.1
0
withscores
1
)
"Think in Java"
2
)
"9.0999999999999996"
3
)
"Effective Python"
4
)
"9"
5
)
"Redis in Action"
6
)
"8.1999999999999993"
根据score的数值降序输出所有元素
zrevrangebyscore books
- inf
- inf withscores
1
)
"Python Cookbook"
2
)
"9.3000000000000007"
3
)
"Effective Java: Second Edition : Java"
4
)
"9.3000000000000007"
5
)
"Think in Java"
6
)
"9.0999999999999996"
7
)
"Effective Python"
8
)
"9"
9
)
"Redis in Action"
10
)
"8.1999999999999993"
+inf 正无穷
-inf 负无穷
删除
zrem key member [member ...]
zrem books
"Effective Java: Second Edition : Java"
(
integer
)
1
增加分数
zincrby key increment member
zincrby books
2
"Redis in Action"
"10.199999999999999"
zincrby books
- 1
"Redis in Action"
"9.1999999999999993"
交集
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE
zadd textbooks
8
"chinese"
9
"english"
9.5
"mathematics"
(
integer
)
3
zadd textbooks
9.2
"Think in Java"
(
integer
)
1
zrange books
0
- 1
1
)
"Redis in Action"
2
)
"Effective Python"
3
)
"Think in Java"
4
)
"Python Cookbook"
zrange textbooks
0
- 1
1
)
"chinese"
2
)
"english"
3
)
"Think in Java"
4
)
"mathematics"
zinterstore newbooks
2
books textbooks
(
integer
)
1
zrange newbooks
0
- 1
1
)
"Think in Java"
并集
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE
zunionstore newUnionbooks
2
books textbooks
(
integer
)
7
zrange newUnionbooks
0
- 1
1
)
"chinese"
2
)
"Redis in Action"
3
)
"Effective Python"
4
)
"english"
5
)
"Python Cookbook"
6
)
"mathematics"
7
)
"Think in Java"
内部编码
ziplist(压缩列表):元素个数小于zset-max-ziplist-entries配置(默认128个)和元素长度小于zset-max-ziplist-value配置(默认64B)时
skiplist(跳跃表):不满足ziplist时
object
encoding books
"ziplist"
结语
本人深知水平有限,欢迎指正本文错误之处。
参考资料
《Redis 实战》
《Redis 开发与运维》
《Redis 深度历险:核心原理与应用实践》
一文了解:Redis基础类型的更多相关文章
- Redis基础类型常用操作命令
Redis基础类型常用操作命令 概念:Redis是用C语言开发的一个开源的高性能键值对数据库. 特征: 数据间没有必然的联系 内部采用单线程机制进行工作 高性能 多数据类型支持 字符串类型 Strin ...
- Redis学习笔记(3) Redis基础类型及命令之二
1. 集合类型 集合类型与列表类型有很多相似之处,但二者的区别在于:前者具有唯一性,但不具有有序性:后者具有有序性,但不具有唯一性.集合类型的常用操作是向集合中加入或删除元素.判断某个元素是否存在等, ...
- Redis学习笔记(2) Redis基础类型及命令之一
1. 基础命令 (1) 获取符合规则的键名列表 格式为:KEYS pattern 其中pattern表示支持通配符 # 建立一个名为bar的键 > SET bar OK # 获取Redis所有键 ...
- REDIS基础笔记
Redis基础笔记 资源链接 简介 简介 安装 五种数据类型及相应命令 1. 字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合 其他 事务 SORT 生存时间 任务队列 发布 ...
- [转帖]《吊打面试官》系列-Redis基础
<吊打面试官>系列-Redis基础 https://www.cnblogs.com/aobing/archive/2019/11/07/11811194.html 你知道的越多,你不知 ...
- redis 五大类型 、持久化方式以及主从(哨兵模式)
一.redis 五大类型: redis 键 keys * exists key的名字,判断某个key 是否存在 move key db 当前数据库就没有了,被移除了 ttl key 查看还有多少秒过期 ...
- redis基础:redis下载安装与配置,redis数据类型使用,redis常用指令,jedis使用,RDB和AOF持久化
知识点梳理 课堂讲义 课程计划 1. REDIS 入 门 (了解) (操作) 2. 数据类型 (重点) (操作) (理解) 3. 常用指令 (操作) 4. Jedis (重点) (操作) ...
- spring boot集成redis基础入门
redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...
- TypeScript 素描-基础类型
博文读自 TypeScript 官方文档而来,不具有学习性,仅是本人学习时记录以供日后翻阅 ,有学习TypeScript的朋友还请去看更为详细的官方文档 TypeScript官网文档中的基础类型, T ...
随机推荐
- K Balanced Teams CodeForces - 1133E (Dp)
题意: 给出 n 个数,选取其中若干个数分别组成至多 k 组,要求每组内最大值与最小值的差值不超过5,求最后被选上的总人数. 题解: 将a[1∼n] 从小到大排序, f[i][j] 表示到第 i 个数 ...
- oralce中的dual详解 转 http://blog.sina.com.cn/s/blog_a5a24bcb0100zeay.html
dual是属于sys的只有一个X varchar2(1)列查询虚拟列不会产生逻辑IO========================================================== ...
- C#类成员初始化顺序
这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是"一般"初始化顺序 ...
- Kafka集群部署指南
一.前言 1.Kafka简介 Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台.Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消息功能添加了Kafka ...
- 充气娃娃什么感觉?Python告诉你
上期为大家介绍了requests库的基本信息以及使用requests库爬取某东的商品页,收到了很多同学的反馈说期待猪哥的更新,猪哥感到非常开心,今天就带大家来玩一把刺激的! 一.需求背景 在实际开发过 ...
- 自动化冒烟测试 Unittest , Pytest 哪家强?
前言:之前有一段时间一直用 Python Uittest做自动化测试,觉得Uittest组织冒烟用例比较繁琐,后来康哥提示我使用pytest.mark来组织冒烟用例 本文讲述以下几个内容: 1.Uni ...
- 02(a)多元无约束优化问题
2.1 基本优化问题 $\operatorname{minimize}\text{ }f(x)\text{ for }x\in {{R}^{n}}$ 解决无约束优化问题的一般步骤 ...
- 【POJ - 1995】Raising Modulo Numbers(快速幂)
-->Raising Modulo Numbers Descriptions: 题目一大堆,真没什么用,大致题意 Z M H A1 B1 A2 B2 A3 B3 ......... AH ...
- Jquery UI sortable
所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象 ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象 ui.p ...
- kali linux 常用文件与指令路径
重启网络 : /etc/init.d/networking restart 语言设置文件 : /etc/default/locale apt 安装deb保存目录 : /var/cache/apt/ar ...