目录

一.通用命令

二.数据结构与内部编码

三.单线程架构


一.通用命令

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

Redis API的理解与使用的更多相关文章

  1. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  2. 【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  3. Redis API与常用数据类型简介

    Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...

  4. redis 单线程的理解

    单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会 ...

  5. 2.API的理解和使用

    标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 ​ zset的成员是唯一的,但分数(score)却可以重复. ​ 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...

  6. qnx:从API开始理解QNX -- 消息传递

    从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接    Chann ...

  7. 第八章· Redis API 开发

    Redis 开发 1.源码安装Python环境 Python官网:https://www.python.org/ #下载Python3.6.4安装包 [root@db03 ~]# wget https ...

  8. Redis 入门到分布式 (二)API的理解和使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 内容: 通用命令 单线程架构 数据结构和内部编码 一.常用的通用命令: keys       计算所有的 ...

  9. 【redis 学习系列】API的理解与使用(二)

    3.哈希 几乎所有的语言都支持了哈希(hash)类型.在Redis中,哈希类型是指键值本身又是一个键值对结构,形如:value = {{field, value} ... {field, value} ...

随机推荐

  1. 深入解析C++ STL中的常用容器

    转载:http://blog.csdn.net/u013443618/article/details/49964299 这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的 ...

  2. 算法之杨辉三角形(Java语言)

    杨辉三角形, 又称贾宪三角形.帕斯卡三角形. 前9层写出来如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 ...

  3. CSS3 transition介绍

    transition从效果上看是一种平滑过渡的动画,本质上是在线性时间内将属性从开始值过渡到结束值.例如获得焦点,点击鼠标等动作导致CSS属性值的变化是瞬间完成的,感觉有点生硬.用transition ...

  4. Mac OS 10.8 配置SVN服务器

    Mac 10.8开始,不再默认安装svn,需要自行安装 如果您安装了XCode,会随同安装svn 更省事的办法: 1.安装homebrew,看看官网 http://brew.sh/index_zh-c ...

  5. December 20th 2016 Week 52nd Tuesday

    With the wonder of your love, the sun above always shines. 拥有你美丽的爱情,太阳就永远明媚. To accept the love from ...

  6. HTTP协议图--HTTP 报文首部之请求行、状态行

    1.请求行 举个栗子,下面是一个 HTTP 请求的报文: GET /index.htm HTTP/1.1 Host: sample.com 其中,下面的这行就是请求行, GET /index.htm ...

  7. MySQL 触发器-更新字段时,status列会加一

    需求:当更新列中的字段时,列中的status字段,就会+1 表结构 CREATE TABLE `test_1` ( `id` int(11) DEFAULT NULL, `name` varchar( ...

  8. JavaScript设计模式之设计原则

    何为设计 即按照哪一种思路或者标准来实现功能,功能相同,可以有不同的设计方案来实现 伴随着需求的增加,设计的作用就会体现出来,一般的APP每天都在变化,更新很快,需求不断在增加,如果设计的不好,后面很 ...

  9. FZU-1608 Huge Mission 线段树(更新懒惰标记)

    题目链接: https://cn.vjudge.net/problem/FZU-1608 题目大意: 长度n,m次操作:每次操作都有三个数:a,b,c:意味着(a,b]区间单位长度的价值为c,若某段长 ...

  10. 【QT】QString类型转换为const char*(toLatin1)

    Qstring str = "helloworld"; char *s; QByteArray ba = str.toLatin1(); s = ba.data(); toLati ...