Redis入门高级部分
Posted zhaoqiang1980
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis入门高级部分相关的知识,希望对你有一定的参考价值。
Redis:
- redis集群查询
- redis批量删除
- redis数据备份和恢复
- redis安全
- redis性能测试
-
Redis 客户端连接
- redis管道技术
- redis分区
- java操作redis
redis集群查询
>cluster info
>cluster nodes
>info replication
redis批量删除
redis的del因为不支持模糊删除,因此一般只能一个一个删除
批量删除使用Linux中的管道和xargs参数:
>redis-cli -h 192.168.68.187 -p 6379 -n 0 keys "myTest*" | xargs redis-cli -h 192.168.68.187 -p 6379 -n 0 del //如果是本地则无需-h -p,-n表示分区,默认为0可以不写
因keys命令会造成redis线程阻塞,在大批量数据时,性能会下降,因此使用scan较好
>redis-cli scan 0 MATCH "mytest" COUNT 100 | xargs redis-cli del
Redis 数据备份与恢复
数据库备份
采用save命令,创建当前数据库的备份,执行后会生成一个dump.rdb文件。这个文件就是数据库的备份文件。
>save
或者使用
>bgsave //后台静默保存
保存文件地址查看:
>config get dir
数据库恢复
将保存的dump.rdb文件拷贝到目标Redis的文件路径下,重启Redis即恢复数据。
Redis 安全
redis中设置config的requirepass密码即可。
127.0.0.1:6380> config get requirepass 1) "requirepass" 2) "dennyzhao" 127.0.0.1:6380> config set requirepass denny OK 127.0.0.1:6380>
Redis 性能测试
redis通过内部测试工具redis-benchmark来检测Redis的性能。
C:\\Users\\zhaoq>redis-benchmark -h 127.0.0.1 -p 6380 -a denny -n 10000 -q PING_INLINE: 76923.08 requests per second PING_BULK: 73529.41 requests per second SET: 62893.08 requests per second GET: 57803.47 requests per second INCR: 75757.58 requests per second LPUSH: 63694.27 requests per second RPUSH: 54054.05 requests per second LPOP: 45454.55 requests per second RPOP: 38610.04 requests per second SADD: 76923.08 requests per second SPOP: 66225.17 requests per second LPUSH (needed to benchmark LRANGE): 52910.05 requests per second LRANGE_100 (first 100 elements): 25974.03 requests per second LRANGE_300 (first 300 elements): 12903.23 requests per second LRANGE_500 (first 450 elements): 9852.22 requests per second LRANGE_600 (first 600 elements): 8058.02 requests per second MSET (10 keys): 60240.96 requests per second
其中 -n 10000 -q 表示模拟1万笔数据发起请求进行测试。
具体参数说明详见http://www.runoob.com/redis/redis-benchmarks.html
Redis 客户端连接
redis服务端通过监听tcp端口来接收客户端的连接,监听后会将客户端的socket设置为非阻塞状态,方便随时进行数据通信。
同时建立一份可读文件来监听客户端的数据传送情况。
最大客户端连接数:
C:\\Users\\zhaoq>redis-cli -h 127.0.0.1 -p 6380 -a denny
127.0.0.1:6380> config get maxclient (empty list or set) 127.0.0.1:6380> config get m* 1) "masterauth" 2) "" 3) "maxmemory" 4) "0" 5) "maxmemory-samples" 6) "5" 7) "maxclients" 8) "10000" 9) "min-slaves-to-write" 10) "0" 11) "min-slaves-max-lag" 12) "10" 13) "maxmemory-policy" 14) "noeviction" 127.0.0.1:6380> config get maxclients 1) "maxclients" 2) "10000" 127.0.0.1:6380>
客户端相关命令:
设定客户端名称方便查找
127.0.0.1:6380> client getname (nil) 127.0.0.1:6380> client setname myTest1 OK 127.0.0.1:6380> client getname "myTest1" 127.0.0.1:6380> client list id=853 addr=127.0.0.1:59978 fd=33 name=myTest1 age=203 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client 127.0.0.1:6380> client pause (error) ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY) 127.0.0.1:6380>
Redis 管道技术
redis采用tcp协议,即无状态保存协议,客户端发起请求,监听socket返回,一次访问回应结束。在socket未返回回应之前,通道属于阻塞状态,这样大大影响了大数据并发写入。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。提高高并发数据写入的速度。
有点像事务处理,但事务处理将所有命令放置在一起,然后统一去执行。
而管道技术是将每个命令去执行,先不管返回,最后统一回收。
127.0.0.1:6380> multi OK 127.0.0.1:6380> set id 5526 QUEUED 127.0.0.1:6380> incr id QUEUED 127.0.0.1:6380> incr id QUEUED 127.0.0.1:6380> incr id QUEUED 127.0.0.1:6380> incr id QUEUED 127.0.0.1:6380> exec 1) OK 2) (integer) 5527 3) (integer) 5528 4) (integer) 5529 5) (integer) 5530 127.0.0.1:6380>
一般通过程序控制来实现。
/** * 管道技术应用 */ Pipeline pip = jedis.pipelined(); for(int i=0;i < 20;i++) { //pip.set("name" + i, "张三" + i); pip.get("name" + i); } //执行并读取 for(Object obj : pip.syncAndReturnAll()) { System.out.println(obj.toString()); };
Redis 分区
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。
Java操作Redis
java操作redis使用jedis.jar 作为驱动。如同ojdbc.jar对应oracle一样。
基础使用:
private final static String R_HOST="127.0.0.1"; private final static String R_AUTO = "denny"; private final static int R_PORT = 6380; public static void main(String[] args) { // 创建客户端连接 Jedis jedis = new Jedis(R_HOST, R_PORT); jedis.auth(R_AUTO); System.out.println(jedis.exists("username")); jedis.set("username", "佟湘玉"); System.out.println(jedis.get("username")); System.out.println(jedis.get("users")); }
以上是关于Redis入门高级部分的主要内容,如果未能解决你的问题,请参考以下文章
redis入门到精通系列:redis高级数据类型详解(BitMaps,HyperLogLog,GEO)
高级RxJava2响应式编程思想,如何开发电商网站,Redis从入门到高