`

redis常用命令

 
阅读更多

敲代码这么久,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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics