// 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实现一个消息队列
方案一、操作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,反之亦然
3、出队2(该方法就像是一个常驻进程一样,只要队伍有值就会出队) set timeOut为0表示消息阻塞,设置为其他数组表示定时轮询。
brpop testlist 0
4、清空所有的list
ltrim key 0 -1
方案二、发布订阅模式
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…