目录
一.通用命令
Redis有五种数据结构,它们是键值对中的值,对于键来说有一些通用的命令.Redis的全局通用命令有:keys,dbsize,exists key,del key [key …],expire key seconds,type key.
1.keys(查看所有键)
虽然keys *命令比较方便实用,但一般不建议在生产环境使用,是因为生产环境的简直对比较多,keys命令比较重,它的查询复杂度为O(n),加入你有几百万个键,这样查询的速度会比较慢,而且Redis是单线程的,这样还会阻塞其它的命令.还有这样取出的数据意义并不大.但是我们有其它的方法可以解决这样的问题,例如:热备从节点,scan命令.这些在后面会仔讲解.
127.0.0.1:> keys *
) "_ROUTE_KEY"
) "mylist"
127.0.0.1:> set hello world
OK
127.0.0.1:> set java jedis
OK
127.0.0.1:> set python redis-py
OK
127.0.0.1:> keys *
) "python"
) "mylist"
) "_ROUTE_KEY"
) "java"
) "hello"
2.dbsize(键总数)
dbsize命令会返回当前数据库的键总数,例如上面我们插入了五条数据,这里就返回了结果:5. 但是dbsize命令不会遍历数据库中所有的键,而是直接获取Redis内置的键总数变量,因此他的时间复杂度为O(1),这点个keys命令不同.
127.0.0.1:> dbsize
(integer)
127.0.0.1:>
3.exists key(检查键是否存在)
使用exists 命令,如果键存在则返回1,不存在则返回0,如下所示:
127.0.0.1:> set a b
OK
127.0.0.1:> exists a
(integer)
127.0.0.1:> del a
(integer)
127.0.0.1:> exists a
(integer)
127.0.0.1:>
4.del key [key …](删除键)
del是一个通用的命令,不管何种类型的数据,都可以将其删除,如果所删除的键存在,则返回 1,不存在则返回 0,如下:
127.0.0.1:> del java
(integer)
127.0.0.1:> del b
(integer)
5.expire key seconds(键过期)
Redis支持对键添加过期时间,当超出所设置的时间,会自动删除键,而且在设置键过期时间之后,我们还可以通过ttl命令来查看key剩余的过期时间,或者通过persist命令来去掉key的过期时间.当键被过期后,用ttl命令查看,则返回结果:2,具体如下:
127.0.0.1:> expire hello
(integer)
127.0.0.1:> ttl hello
(integer) -
6.type key(键的数据结构类型)
如下,python是字符串类型,返回结果便为string,键mylist 是列表类型,返回结果则是list:
127.0.0.1:> type python
string
127.0.0.1:> type mylist
list
二.数据结构与内部编码
type命令所返回的实际上就是当前key的数据结构类型,他们分别是string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合),但这只是Redis对外的数据结构.实际上每种数据结构还有自己底层的内部编码实现,例如list就包含了linkedlist和ziplist两种内部编码,不过我们也可以通过object encoding命令来查询内部编码.
图1:
图2:
三.单线程架构
Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务.
1.单线程模型
首先来看下客户端与服务端的简单模型图,如图3所示,可以从图中看出每次客户端都只是经历:发送命令,执行命令和返回结果三个过程.
图3:
其中,这最主要的还是因为Redis是单线程来处理命令的,所以一条命令从客户端发送到服务端,不会立马被执行,所有的命令都会放到一个队列之中,然后逐个被执行,这就是redis的但线程的基本模型.
图4:
图5:
2.为什么单线程这么快?
1)纯内存访问,Redis讲所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础.
2)非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis的事件处理模型将epoll中的连接,读写,关闭都转换为事件,不在网络I/O上浪费过多的时间,如图6所示:
3)单线程避免了线程切换和竞态产生的消耗.
图6:
参考:redis开发与运维
最后语:不积跬步,无以至千里;不积小流,无以成江海。对于知识总要温故,这样才能知新!
版权声明:尊重博主原创文章,转载请注明出处 https://www.cnblogs.com/hsdy