redis常用命令

89 阅读3分钟

d77c6a36acb3dc7224af4d65a4c474b6.png转存失败,建议直接上传图片文件 d77c6a36acb3dc7224af4d65a4c474b6.png转存失败,建议直接上传图片文件 // redis常用命令 blog.csdn.net/zhulier1124…; // 使用redis记录日志 www.cnblogs.com/alimayun/p/…

常用命令: blog.csdn.net/ithomer/art…

中文乱码: redis-cli --raw

远程连接: redis-cli -h 127.0.0.1 -p 6379

查看连接数:  info clients

查看最大连接数: CONFIG GET maxclients

redis版本信息查看: info

1、清空所有缓存

flushall

2、简单使用

2.1 简单连接并添加数据

Jedis jedis = new Jedis("172.23.88.107", 6379); // 连接redis
jedis.auth("czRedis"); // 输入密码(没有可以不写)
jedis.set("addr", "chonginq"); // set 键值对
jedis.del("addr"); // 按键删除

2.2 piep使用

Pipeline pipelined = jedis.pipelined();
for (int i=0; i<100; i++) {
    pipelined.multi(); // 开启事务   
    //pipelined.lpush("test"+i, i+"");   
    pipelined.del("test"+i);   
    pipelined.exec(); // 执行   
    pipelined.sync(); // 表示我一次性的异步发送到redis,不关注执行结果。
    // List<Object> objects = pipelined.syncAndReturnAll(); //  程序会阻塞,等到所有命令执行完之后返回一个List集合。
}
pipelined.close();


使用redis实现一个消息队列

www.cnblogs.com/qlqwjy/p/97…

方案一、操作list实现

1、入队(从左到右)

lpush testlist a b c d // lpush 表示left push

入队(从右到左)

rpush testlist a b c d // rpush 表示 right push

2、出队(该出队方法浪费资源不会形成阻塞)

rpop testlist 或者 lpop testlist // 如果入队时left出队就是right,反之亦然

d77c6a36acb3dc7224af4d65a4c474b6.pngd77c6a36acb3dc7224af4d65a4c474b6.png

3、出队2(该方法就像是一个常驻进程一样,只要队伍有值就会出队) set timeOut为0表示消息阻塞,设置为其他数组表示定时轮询。

brpop testlist 0

d77c6a36acb3dc7224af4d65a4c474b6.pngd77c6a36acb3dc7224af4d65a4c474b6.png 4、清空所有的list ltrim key 0 -1 0aca6f0266ed527bccd39d7a793150ce.png转存失败,建议直接上传图片文件

方案二、发布订阅模式

1、消息发表

publish channel:message chengzhi

其中channel表示渠道的意思 2、消息订阅

subscribe channel:message
psubscribe channel:m* a? // 表示订阅多个渠道的消息,m开头的任意渠道,a开头的两位的渠道例如:ab,ac,ad...

3、常用命令

3.1、设置key过期时间

expire key sends // 单位秒

pexpire key milliseconds // 单位毫秒 例如 expire czTest 60 // 表示czTest键60秒后过期

expire czTest 20 // 更新过期时间 ttl key // 查看过期剩余时间(单位 秒)

3.2、自增

incr key 例如: incr czTest // 每次调用增加1,如果没有改值则自动创建后再增加1

3.3 查看List的大小

llen key

3.4 删除Key

del key

3.5 使用lua操作redis

删除模糊匹配到的key

eval "local keys = redis.call('KEYS', KEYS[1]); local keysCount = table.getn(keys); if(keysCount > 0) then for _, key in ipairs(keys) do redis.call('del', key); end; end; return keysCount;" 1 *LuoThinking>*

设置值

eval "return redis.call('set',KEYS[1],ARGV[1])" 1 nameccc sym

查看值

eval "return redis.call('set',KEYS[1])" 1 nameczz

使用一个redis实现分布式锁

1、初级阶段

setnx(set if not exists) 加锁: setnx lock:test true 释放锁 del lock:test

2、进阶一下,因为上面的会出现如果中间业务断开,导致释放锁不成功

加锁: setnx lock:test true 设置5秒过期时间: expire lock:test 5 释放锁: del lock:test

3、继续进阶,因为上面虽然可以保证key被清除,释放锁,但是如果因为某些原因,expire没有执行,因为不是原子操作,也会导致锁释放不了。

redis2.8之后做了优化: 加锁: set lock:test true ex 5 nx

释放锁: del lock:test 这次即使不去主动释放也会在5秒之后自动释放

4、持续进阶、上面的如果遇到业务执行时间太长,超过了5秒的限制,锁会提前释放,那么第二个线程会进来操作,当第二个线程还没有操作完时,锁被第一个线程释放了,第三个线程会和第二个线程同时操作被锁资源,导致失去锁的意义。

解决方法1、 人为控制,业务耗时长的时候不使用redis实现分布式锁,或者适当增加锁自动释放时间

解决方法2、 加锁的方式不变,在释放锁的时候判断是否是自己线程的锁。 加锁的时候value值给一个随机数,释放的时候使用lua判断这个随即数是否是自己设定的。 例如: if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end

代码实现: gitee.com/billion/red…