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
OK

mget 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
    OK

    lrange letter
    0

  • 1
    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
OK

lrange 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
OK

hmget 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基础类型的更多相关文章

  1. Redis基础类型常用操作命令

    Redis基础类型常用操作命令 概念:Redis是用C语言开发的一个开源的高性能键值对数据库. 特征: 数据间没有必然的联系 内部采用单线程机制进行工作 高性能 多数据类型支持 字符串类型 Strin ...

  2. Redis学习笔记(3) Redis基础类型及命令之二

    1. 集合类型 集合类型与列表类型有很多相似之处,但二者的区别在于:前者具有唯一性,但不具有有序性:后者具有有序性,但不具有唯一性.集合类型的常用操作是向集合中加入或删除元素.判断某个元素是否存在等, ...

  3. Redis学习笔记(2) Redis基础类型及命令之一

    1. 基础命令 (1) 获取符合规则的键名列表 格式为:KEYS pattern 其中pattern表示支持通配符 # 建立一个名为bar的键 > SET bar OK # 获取Redis所有键 ...

  4. REDIS基础笔记

    Redis基础笔记 资源链接 简介 简介 安装 五种数据类型及相应命令 1. 字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合 其他 事务 SORT 生存时间 任务队列 发布 ...

  5. [转帖]《吊打面试官》系列-Redis基础

    <吊打面试官>系列-Redis基础 https://www.cnblogs.com/aobing/archive/2019/11/07/11811194.html   你知道的越多,你不知 ...

  6. redis 五大类型 、持久化方式以及主从(哨兵模式)

    一.redis 五大类型: redis 键 keys * exists key的名字,判断某个key 是否存在 move key db 当前数据库就没有了,被移除了 ttl key 查看还有多少秒过期 ...

  7. redis基础:redis下载安装与配置,redis数据类型使用,redis常用指令,jedis使用,RDB和AOF持久化

    知识点梳理 课堂讲义 课程计划 1. REDIS 入 门 (了解) (操作)   2. 数据类型 (重点) (操作) (理解) 3. 常用指令   (操作)   4. Jedis (重点) (操作) ...

  8. spring boot集成redis基础入门

    redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...

  9. TypeScript 素描-基础类型

    博文读自 TypeScript 官方文档而来,不具有学习性,仅是本人学习时记录以供日后翻阅 ,有学习TypeScript的朋友还请去看更为详细的官方文档 TypeScript官网文档中的基础类型, T ...

随机推荐

  1. MySql EF事务using不会自动 Rollback的bug

    EF to MySql一般都是用using最后Commit,一直以为最后没Commit,当using调用Dispose会自动Rollback,没想到这儿有个坑,mysql有个bug并不会Rollbac ...

  2. 在?MySQL事务隔离级别了解一下?

    事务的四大ACID 属性:Atomicity 原子性.Consistency 一致性.Isolation 隔离性.Durability 持久性. 原子性: 事务是最小的执行单位不可分割,强调事务的不可 ...

  3. 好用的在线画图工具processon

    ProcessOn是一款基于SaaS的前沿.高效线上作图工具,它将Visio.Xmind等专业作图工具搬到了"云端" 注册链接:https://www.processon.com/ ...

  4. 剑指offer第二版-8.二叉树的下一个节点

    描述:给定一棵二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中应定义指向左节点.右节点.父节点的三个变量. 思路: 1.如果输入的当前节点有右孩子,则它的下一个节点即为该右孩子为根节点的子树 ...

  5. python笔记(2)--字符串

    一.字符串 字符串是不可变序列,具有序列的公共操作方法,具体操作见python笔记(1)--序列(列表 元组 range) 1.创建字符串 单引号:'Hello , I am Logan ! ' 双引 ...

  6. C语言指针专题——指针难学的4点原因

    前一篇跟大家聊了聊指针的概念,可是就算了解了指针是什么,为什么依然感觉难学?我试着从几个点切入,聊聊指针难学之处. 文末会给大家推荐几本书,有需要的朋友可以看看! 难点1. 讨厌的星号 定义指针变量p ...

  7. 洛谷P4994 终于结束的起点 题解

    求赞,求回复,求关注~ 题目:https://www.luogu.org/problemnew/show/P4994 这道题和斐波那契数列的本质没有什么区别... 分析: 这道题应该就是一个斐波那契数 ...

  8. c++小游戏——俄罗斯方块

    #include<cstdio> #include<windows.h> #include<ctime> int a[24][17],i,j,tim=800,ti= ...

  9. 「Sqlserver」数据分析师有理由爱Sqlserver之二-像使用Excel一般地使用Sqlserver

    大家一谈数据库,就觉得非常高深莫测,深不见底,非凡人敢去触摸.但Excel的话,没人敢说自己不会使用吧(相反一大堆人的简历上写着精通OFFICE所有软件套件).换作其他非微软厂商的数据库,的确很容易产 ...

  10. Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据

    在金融大数据功能中,使用了TuShare的数据接口,其所有接口都采用WebAPI的方式提供,本来还在纠结着应该搬那些数据接口给用户使用,后来发现,所有数据接口都有其通用性,结合Excel灵活友好的输入 ...