敲代码这么久,redis也用的比较多了,把自己平常知道的知识点记录一下,方便以后查看。
一、redis配置,持久化、内存满了之后的策略、超时时间等等,都是可配置的。
二、Redis的持久化存储提供两种方式:Snapshot(RDB)与Append-only file(AOF)。RDB是默认配置。AOF需要手动开启。
现在Redis的配置中默认是关闭AOF模式的。
如果要开启AOF模式,修改Redis的配置文件redis.conf。
三、redis绝大部分操作基于内存,类似hashmap查找和操作时间复杂度都是O(1);数据结构专门设计,简单。采用单线程,避免不必要的上下文切换和竞争。使用多路I/O复用模型,非阻塞IO。redis最可能瓶颈的地方是内存或网络带宽,而不是CPU。虽然redis处理请求是单线程,但持久化等操作是fork出子线程或子进程处理的。
单进程多线程模型:mysql、memcached、oracle(windows版本);
多线程模型:orcle(linux版本)
nginx两类进程:一类是master进程(管理进程),一类是worker进程(工作进程),启动方式可分为单进程启动(一个进程,既是master又是worker)、多进程启动(仅有一个master,至少一个worker)。其中,master主要进行一些全局性的初始化工作和管理worker的工作,事件都是在worker中处理。
1、连接
#切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379
2、查询内存占用等信息
info info cpu info commandstats ...
3、查询key,模糊匹配。众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会阻塞服务器,对单线程的redis来说,简直是灾难,终于找到了替代命令scan
scan 0 scan 0 count 100 scan 0 match liugangxin* count 100
4、查看慢日志
SLOWLOG GET 1) 1) (integer) 4 # 日志的唯一标识符(uid) 2) (integer) 1378781447 # 命令执行时的 UNIX 时间戳 3) (integer) 13 # 命令执行的时长,以微秒计算 4) 1) "SET" # 命令以及命令参数 2) "database" 3) "Redis"
四、管道技术
Reids是一个cs模式的Tcp服务,类似于http的请求。 当客户端发送一个请求时,服务器处理之后会将结果通过响应报文返回给客户端 。
那么当需要发送多个请求时,难道每次都要等待请求响应,再发送下一个请求吗?难道请求之后必须阻塞等待返回值?
当然不是,这里就可以采用Redis的管道技术。
举个例子,如果说jedis是:request response,request response,…;
那么pipeline则是:request request… response response的方式。
所以,管道比较适合用来做批量操作。注意:管道(pipeline)是打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。即可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间,而且Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。
管道(Pipelining) VS 脚本(Scripting):
大量 pipeline 应用场景可通过 Redis 脚本(Redis 版本 >= 2.6)得到更高效的处理,后者在服务器端执行大量工作。脚本的一大优势是可通过最小的延迟读写数据,让读、计算、写等操作变得非常快(pipeline 在这种情况下不能使用,因为客户端在写命令前需要读命令返回的结果)。
应用程序有时可能在 pipeline 中发送 EVAL 或 EVALSHA 命令。Redis 通过 SCRIPT LOAD 命令(保证 EVALSHA 成功被调用)明确支持这种情况.
五、lua脚本,原子操作,不支持集群。
Jedis jedis = cache.getResource().getJedis(); String[] allUserKeys={"u1","u2"}; List<String> keys = Arrays.asList(allUserKeys); List<String> params = new ArrayList<String>(); params.add("xx"); params.add("xxx"); String SCRIPT=""; String shaFuncKey = jedis.scriptLoad(SCRIPT);//加载脚本 List<String> resultKeys=new ArrayList<String>(); try { resultKeys = (List<String>)jedis.evalsha(shaFuncKey, keys, params); } catch (Exception e) { e.printStackTrace(); }
六、集群
Redis作者在3.0版本中已经加入了集群功能,而2.x版本中用ShardedJedis来实现分布式缓存,ShardedJedis是通过一致性哈希来实现分布式缓存的,通过一定的策略把不同的key分配到不同的redis server上,达到横向扩展的目的。其除了配置时有点区别,其他和Jedis基本类似。但不支持多命令操作,像mget、mset、brpop等。集群
即使有了主从复制,每个数据库都要保存整个集群中的所有数据,容易形成木桶效应。 使用Jedis实现了分片集群,是由客户端控制哪些key数据保存到哪个数据库中,如果在水平扩容时就必须手动进行数据迁移,而且需要将整个集群停止服务,这样做非常不好的。 redis3.0集群的特点: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4)redis-cluster把所有的物理节点映射到[0-16383]slot(插槽)上,cluster 负责维护node<->slot<->value
测试:
先说说bitmap,就是基于位的映射,一个bit位标记一个元素的value,长度取决于最大的那个值。可做排序用。
优点:
1. 运算效率高,不进行比较和移位;
2. 占用内存少,比如最大的数MAX=10000000;只需占用内存为MAX/8=1250000Byte=1.25M。
缺点:
1. 所有的数据不能重复,即不可对重复的数据进行排序。(少量重复数据查找还是可以的,用2-bitmap)。
2. 当数据类似(1,1000,10万)只有3个数据的时候,用bitmap时间复杂度和空间复杂度相当大,只有当数据比较密集时才有优势
bug问题描述,setbit方法,offset偏移量就是比特位字符串的长度,即偏移100,就长度为100,所以当偏移量很大时,这个值就特别长,占用内存也特别大。导致线上缓存暴增。
说明
List 数据类型 没有 List 个数限制,单个元素最大值为 512 MB,推荐 list的元素个数小于 8192, value 最大长度不超过 1 MB。
Set 数据类型 没有 set 个数限制,单个元素最大值为 512 MB,推荐 set 的元素个数小于 8192, value 最大长度不超过 1 MB。
Sorted set 数据类型 没有 sorted set 个数限制,单个元素最大值为 512 MB,推荐 sorted set 的元素个数小于 8192, value 最大长度不超过 1 MB。
Hash 数据类型 没有 field 个数限制,单个元素最大值为 512 MB,推荐元素个数小于 8192, value 最大长度不超过 1 MB。
DB 数限制 每个实例支持 256 个 DB。
监控报警 云数据库 Redis 版未提供容量告警,需要用户到云监控中进行配置。配置方法请参见文档。
建议设置好以下监控的报警:实例故障、实例主备切换、已使用连接百分比、操作失败数、已用容量百分比、写入带宽使用率、读取带宽使用率。
数据过期删除策略 - 主动过期,系统后台会周期性的检测,发现已过期的key时,会将其删除。
- 被动过期,当用户访问某个key时,如果该key已经过期,则将其删除。
空闲连接回收机制 服务端不主动回收 Redis 空闲连接,由用户管理。
数据持久化策略 采用 AOF_FSYNC_EVERYSEC 方式,每秒 fysnc。
分析redis工具:
https://github.com/xiepaup/dbatools
相关推荐
### Redis常用命令详解 Redis(Remote Dictionary Server)是一款开源的键值存储系统,以其高性能、低延迟的特点在缓存、消息队列等场景下得到广泛应用。本文将对Redis中的常用命令进行详细介绍,帮助读者更好地...
封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip...
下面是对 Redis 的常用命令、配置文件、持久化、事务、主从复制、Jedis 使用的详细讲解。 Redis 常用命令 Redis 提供了很多有用的命令来管理和操作数据。下面是一些常用的 Redis 命令: * SET key value:设置...
redis命令实践 redis常用命令详细带例子
思维导图:Redis常用命令
redis常用命令操作.txt
### Redis常用命令详解 Redis是一种高性能的键值对存储系统,因其卓越的速度和灵活性而广泛应用于缓存、消息队列等多种场景。本文将基于提供的文件信息,深入解析几个Redis中的常用命令及其应用场景。 #### 一、键...
【Redis常用命令详解】 Redis是一种高性能的键值存储系统,广泛应用于缓存、数据库和消息队列等场景。本篇文章将深入讲解Redis中的一些常用命令,包括Connection连接、Server管理和Key操作。 **6.1 Connection连接...
Redis 常用命令和场景使用 Redis 是一个开源的、基于内存的数据结构存储系统,提供了丰富的命令来处理不同的数据类型和场景。下面是 Redis 中一些常用的命令和场景使用: 字符串命令 1. SET:设置键值对,覆盖...
### Redis常用命令实践 #### 一、概述 Redis是一种高性能的键值存储系统,它能够支持多种复杂的数据结构,如字符串、哈希、列表、集合、有序集合等,并且提供了丰富的命令来操作这些数据结构。这使得Redis不仅适用...
### Redis 命令实践详解 #### 一、基本命令 Redis 提供了一系列的基本命令来操作键值对数据。这些命令简单易用,是 Redis 的基础功能。 ##### SET **命令格式**: `SET key value` - **作用**: 设置键 `key` 的...
Redis 常用命令整理 Redis 是一种高性能的 Nosql 数据库,具有丰富的命令集,以下是 Redis 中常用的命令整理: 连接操作相关的命令 * quit:关闭连接(connection) * auth:简单密码认证持久化 * save:将数据...
### Redis 常用命令及 Java 实现 #### 一、Redis 命令简介 Redis 是一个开源的键值数据库系统,它提供了多种数据结构的存储方式,并且支持简单的事务处理、主从同步等功能。在开发过程中,Redis 的一些基本命令被...
以上所述的知识点涵盖了Redis的基本使用,包括数据类型、特性、操作命令、缓存问题及解决方案等,对于理解和运用Redis具有重要的参考价值。在实际使用Redis的过程中,开发者应根据应用场景和需求选择合适的数据结构...