高可用Redis(一):通用命令,数据结构和内部编码,单线程架构
1.通用API
1.1 keys命令和dbsize命令
keys * 遍历所有key
keys [pattern] 遍历模式下所有的key
dbsize 计算Redis中所有key的总数
例子:
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set php good
OK
127.0.0.1:6379> set python best
OK
127.0.0.1:6379> keys * # 查看Redis中所有的key
1) "hello"
2) "python"
3) "php"
127.0.0.1:6379> dbsize # 查看Redis中key的总数
(integer) 3
127.0.0.1:6379> keys p* # 查看Redis中以p开头的所有的key
1) "python"
2) "php"
127.0.0.1:6379> set perl aaa
OK
127.0.0.1:6379> set c++ bbb
OK
127.0.0.1:6379> keys p* # 查看Redis中所有的key
1) "python"
2) "php"
3) "perl"
127.0.0.1:6379> dbsize # 查看Redis中key的总数
(integer) 5
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> dbsize # 查看Redis中key的总数
(integer) 9
注意事项:
!.keys命令的时间复杂度为O(n)
2.在生产环境中,使用keys命令取出所有key并没有什么意义,而且Redis是单线程应用,如果Redis中存的key很多,使用keys命令会阻塞其他命令执行,所以keys命令一般不在生产环境中使用
3.dbsize命令的时间复杂度是O(1)
4.Redis内置一个计数器,可以实时更新Redis中key的总数,所以dbsize命令可以在线上使用
1.2 exists命令和del命令
exists key 判断一个key是否存在
del key [key...] 删除指定的key-value
例子:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> exists k1 # 判断k1是否存在
(integer) 1
127.0.0.1:6379> exists k2 # 判断k2是否存在
(integer) 1
127.0.0.1:6379> del k1 # 删除k1这个键值对
(integer) 1
127.0.0.1:6379> exists k1 # 判断k1是否存在,0表示不存在
(integer) 0
127.0.0.1:6379> exists k2 # 判断k2是否存在,1表示key存在
(integer) 1
127.0.0.1:6379> set a1 b1
OK
127.0.0.1:6379> set a2 b2
OK
127.0.0.1:6379> del a1 a2 # 删除a1和a2键值对
(integer) 2
注意事项:
del命令和exists命令的时间复杂度为O(1)
1.3 expire命令,ttl命令和persist命令
expire key seconds 设置key的过期时间,多少seconds后过期
ttl key 查看key剩余的过期时间
persist key 去掉key的过期时间
例子:
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1 # 设置hello这个key的过期时间为20秒
127.0.0.1:6379> ttl hello
(integer) 17 # 还有17秒过期
127.0.0.1:6379> ttl hello
(integer) 11 # 还有11秒过期
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) 5 # 还有5秒过期
127.0.0.1:6379> ttl hello
(integer) -2 # -2表示key已经不存在了
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1 # 设置hello这个key的过期时间为20秒
127.0.0.1:6379> ttl hello
(integer) 15 # 还有15秒过期
127.0.0.1:6379> persist hello
(integer) 1 # 删除hello的过期时间
127.0.0.1:6379> ttl hello
(integer) -1 # -1表示key存在,并且没有过期时间
127.0.0.1:6379> get hello
"world"
注意事项:
expire命令和ttl命令,persist命令的时间复杂度都是O(1)
1.4 type命令
type key # 返回key的类型
例子:
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> type myset
set
127.0.0.1:6379> type abc # 查看一个不存在的key时,返回None,表示key不存在
none
注意事项:
type的返回结果有6种:string,hash,list,set,zset,none
type命令的时间复杂度为O(1)
2.数据结构和内部编码
Redis每种数据结构及对应的内部编码如下图所示

3.单线程架构
Redis内部使用单线程架构。
比如一条公路,这条公路只有一条车道。所有从这条车道上行驶的车,都必须按先来后到的顺序依次行驶
Redis一个瞬间只能执行一条命令,不能执行两条命令
3.1 Redis单线程为什么这么快
1.纯内存
Redis把所有的数据都保存在内存中,而内存的响应速度是非常快的
2.非阻塞IO
Redis使用epoll异步非阻塞模型
Redis自身实现了事件处理
3.避免线程切换和竞态消耗
在使用多线程编程中,线程之间的切换也会消耗一部分CPU资源,
如果不合理的实现多线程编程,可能比单线程还要慢
注意事项:
一次只运行一条命令
拒绝长(慢)命令
keys
flushall
flushdb
slow lua script
mutil/exec
operate
高可用Redis(一):通用命令,数据结构和内部编码,单线程架构的更多相关文章
- Redis入门到高可用(四)—— Redis的五种数据结构的内部编码
Redis的五种数据结构的内部编码
- Redis的五种数据结构的内部编码
type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串).hash(哈希). list(列表).set(集合).zset(有序集合),但这些只是Redis对外的数据结构. 实 ...
- Redis从出门到高可用--Redis复制原理与优化
Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...
- 如何搭建高可用redis架构?
如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...
- centos下搭建高可用redis
Linux下搭建高可用Redis缓存 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Li ...
- 高可用Redis服务架构分析与搭建
基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
- 高可用Redis服务架构分析与搭建(单redis实例)
原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...
- 高可用Redis(十二):Redis Cluster
Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的 ...
随机推荐
- 【python 字符串】 字符串的相关方法(二)
查找元素所在的第一个的索引位置 text.find() 可有开始和结束位置查找 find('ex',3,6) # 查找元素的索引位置 text = 'alexalex' ret = text. ...
- Cordova Upload Images using File Transfer Plugin and .Net core WebAPI
In this article, I am going to explain ,"How to Upload Images to the server using Cordova File ...
- java篇 之 java概念
Jvm:java虚拟机,让java拥有跨平台的能力,一次编写,导出运行 Java优点:提供了一个解释性环境(多线程,可执行程序跨平台,加快开发,支持动态更新) 没有指针,有垃圾将回收器(回收内存) 执 ...
- bugku web 管理员系统
页面是一个登陆表单,需要账号密码,首先f12查看源代码,发现有一段可疑的注释,明显是base64,解码得到test123,似乎是一个类似于密码的东西,既然是管理员,就猜测用户名是admin,填上去试一 ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- JavaScript基础入门 - 01
JavaScript入门 - 01 准备工作 在正式的学习JavaScript之前,我们先来学习一些小工具,帮助我们更好的学习和理解后面的内容. js代码位置 首先是如何编写JavaScript代码, ...
- kubernetes 1.14安装部署dashboard
简单介绍: Dashboard是一个基于web的Kubernetes用户界面.您可以使用Dashboard将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障诊断,并管理集群资源. ...
- 对于BFS的理解和部分例题(
(图文无关 雾 搜索是一个NOIP当中经常出现的考点,其实搜索换个方式来想也无非就是让电脑来帮你试,最后得到一个结果,当然这么口胡谁都会,那么我们就来看看搜索当中的一个大部分: BFS(广度优先 ...
- Vue状态管理之Vuex
Vuex是专为Vue.js设计的状态管理模式.采用集中存储组件状态它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 1.首先让我们从一个vue的计数应用开始 ...
- 同样级别iOS程序员,为啥比我菜的程序员薪资都比我高?
前言: 作为程序员,都有一种相同的焦虑——即当一次又一次的新技术浪潮袭来,总会不由自主的拼命跟随,总是担心如果不紧跟新技术的潮流,将会被时代所抛弃. 害怕年龄,害怕平庸,其实只是你在现实里的努力无法支 ...