redis(一):redis的特性,常用命令,内部结构

1.redis的特性

(1)速度快:主要是依赖内存的高速度
(2)可以持久化:AOF和RDB
(3)多种数据结构:
(4)支持高可用和分布式:在redis2.8支持sentinal和在redis3.0以后就cluster支持分布式

2.redis的返回值

(1)状态回复:ping -> pong
(2)错误回复:hget hello world -> [ERROR]
(3)整数回复:incr hello -> 1
(4)字符回复:get hello -> world
(5)多行字符串回复: mget hello -> world

3.redis查看配置

在这里插入图片描述

4.通用命令

set:设置<key,value>数据
keys:查看有哪些key
dbsize:查看keys数量
exists:查看某个key是否存在
del:删除某一个key
expire:给某一个key设置过期时间
type:查看某一个数据的数据类型

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> keys *
1) "hello"
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> set hello2 world
OK
127.0.0.1:6379> expire hello2 60
(integer) 1
127.0.0.1:6379> type hello2
string

mset:给多个key设置value
he*:表示前两位是he,后面数据随意
he[i-j]*:表示前两位是he,第三位是i到j之间的字符,后面数据随意
ph?:表示数据长度为3,前两位是ph,第三位随意

127.0.0.1:6379> mset hello world hehe haha php good phe this
OK
127.0.0.1:6379> keys he*
1) "hello"
2) "hehe"
127.0.0.1:6379> keys he[i-j]*
(empty list or set)
127.0.0.1:6379> keys ph?
1) "php"
2) "phe"

sadd:将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略
SMEMBERS:查看集合中的元素

127.0.0.1:6379> sadd myset 01
(integer) 1
127.0.0.1:6379> sadd myset 02
(integer) 1
127.0.0.1:6379> sadd myset 01
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "02"
2) "01"

ttl :查看key的过期时间,-1表示永不过期
persist:取消key的过期时间

127.0.0.1:6379> expire hello 60
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 52
127.0.0.1:6379> persist hello
(integer) 1
127.0.0.1:6379> ttl hello
(integer) -1

5.数据结构和内部编码

每种树结构都有其内部编码方式:
在这里插入图片描述
不同的集合具有多种编码方式就是为了适用不同的场合,比如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。

比如:字符串类型的内部编码有3种:
int:8个字节的长整型。
embstr:小于等于39个字节的字符串。
raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用内部编码实现。

#int
127.0.0.1:6379> set str 1234567 
OK
127.0.0.1:6379> object encoding str
"int"
#emstr
127.0.0.1:6379> set str "hello world"
OK
127.0.0.1:6379> object encoding str
"embstr"
#raw
127.0.0.1:6379> set str "Tranquil,unbeatable to the outside. -- yangming" 
OK
127.0.0.1:6379> object encoding str
"raw"

哈希类型的内部编码有两种:
ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现。因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

列表的内部编码:
ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现。
linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

集合类型的内部编码有两种:
intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合内部实现,从而减少内存的使用。
hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。当元素不是整数时使用hashtable。

有序集合类型的内部编码有两种
ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个)同时每个元素的值小于zset-max-ziplist-value配置(默认64个字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存使用。
skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时zip的读写效率会下降。

redis的Object类:存放了某种数据结构的详细参数。
在这里插入图片描述

5.redis单线程

redis内部一次性只能执行一条命令,否则会排队等待。
redis内部使用的epoll模型(一种非阻塞IO),单线程实现高性能。
在这里插入图片描述
所有的同步的NIO复用就是reactor模型,有一个reactor不断地去处理请求和执行请求的对接。
在这里插入图片描述

epoll模型和select模型:
select模型: 如果将事件分为两步,获取事件请求和执行事。select保持了一个请求队列,每个请求进来就加入队列,然后去不断的轮询该线程所需要的资源是否准备就绪,准备就绪就执行。
epoll模型: 相比select的轮询,以redis为例,redis接受了某一个命令A的请求,就会等待前一个事件E把执行该命令A需要的资源释放,E资源释放以后会调用一个回调函数告诉redis该资源准备就绪(此时redis轮询一次所有的资源),命令A得到执行。
ps:因为redis轮询了一次所有的资源状态,所以还不是真意义上AIO,我们有时候也称之为伪AIO

6.redis执行注意事项

拒绝长命令:(下面列举一些长命令)
keys:查询所有key
flushall:清空所有数据库(redis中有多个DB)
flushdb:清空当前DB
mutil/exec:事务

关于事务:
mutil:表示事务的开启
exec:事务的结束
事务中执行的命令会依次加入到一个队列中,一直到exec命令执行的时候才会逐一执行。

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set hello 1
QUEUED
127.0.0.1:6379> set hello 2
QUEUED
127.0.0.1:6379> set hello 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> get hello
"3"

关于redis分布式锁:https://blog.csdn.net/qq_35688140/article/details/100983288

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值