吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 909|回复: 2
收起左侧

[讨论] Redis学习笔记-2

[复制链接]
tomcar 发表于 2021-7-25 19:23
本帖最后由 tomcar 于 2021-8-6 07:48 编辑

2、分布式锁
[Bash shell] 纯文本查看 复制代码
>setnx lock:codehole true
....
>del lock:codehole

>setnx lock:codehole true
>expire lock:codehole 5      #5s后释放锁
...
>del lock:codehole
为了解决setnx与expire之间出现的一些不可预测问题,做了改进
>set lock:codehole true ex 5 nx
...
>del lock:codehole



3、延时队列实现
rpush lpop    lpush rpop
pop改为延时pop,不会使队列中空了还在一直pop浪费资源
lpop -> blpop
rpop -> brpop
代码实现:
[Java] 纯文本查看 复制代码
import java.lang.reflect.Type;
import java.util.Set;
import java.util.UUID;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import redis.clients.jedis.Jedis;
public class RedisDelayingQueue<T> {
     static class TaskItem<T> {
         public String id;
         public T msg;
     }
     // fastjson 序列化对象中存在 generic 类型时,需要使用 TypeReference
     private Type TaskType = new TypeReference<TaskItem<T>>() { }.getType();
     private Jedis jedis;
     private String queueKey;
     public RedisDelayingQueue(Jedis jedis, String queueKey) {
         this.jedis = jedis;
         this.queueKey = queueKey;
     }
     public void delay(T msg) {
         TaskItem task = new TaskItem();
         task.id = UUID.randomUUID().toString(); // 分配唯一的 uuid
         task.msg = msg;
         String s = JSON.toJSONString(task); // fastjson 序列化
         jedis.zadd(queueKey, System.currentTimeMillis() + 5000, s); // 塞入延时队列 ,5s 后再试
     }
     public void loop() {
         while (!Thread.interrupted()) {
             // 只取一条
             Set values = jedis.zrangeByScore(queueKey, 0, System.currentTimeMillis(), 0, 1);
             if (values.isEmpty()) {
                 try {
                     Thread.sleep(500); // 歇会继续
                 } catch (InterruptedException e) {
                     break;
                 }
                 continue;
             }
             String s = values.iterator().next();
             if (jedis.zrem(queueKey, s) > 0) { // 抢到了
                 TaskItem task = JSON.parseObject(s, TaskType); // fastjson 反序列化
                 this.handleMsg(task.msg);
             }
         }
     }
     public void handleMsg(T msg) {
         System.out.println(msg);
     }
     public static void main(String[] args) {
         Jedis jedis = new Jedis();
         RedisDelayingQueue queue = new RedisDelayingQueue<>(jedis, "q-demo");
         Thread producer = new Thread() {
             public void run() {
                 for (int i = 0; i < 10; i++) {
                     queue.delay("codehole" + i);
                 }
             }
         };
         Thread consumer = new Thread() {
             public void run() {
                 queue.loop();
             }
         };
         producer.start();
         consumer.start();
         try {
             producer.join();
             Thread.sleep(6000);
             consumer.interrupt();
             consumer.join();
         } catch (InterruptedException e) {
         }
     }}

4、位图
[Bash shell] 纯文本查看 复制代码
>setbit s 1 1                 #10000000
>setbit s 2 1                #11000000
>setbit s 4 1                #11010000
>setbit s 9 1                #11010000 10000000
>setbit s 10 1               #11010000 11000000
>setbit s 13 1               #11010000 11001000
>setbit s 15 1               #11010000 11001010
>get s                          #"he"
>getbit s 1                   #1

[Bash shell] 纯文本查看 复制代码
>set w hello
>bitcount w                #21
>bitcount w 0 0          #第一个字符中1的个数
>bitcount w 0 1           #第二个字符中1的个数
>bitpos w 0                 #第一个0位
>bitpos w 1                  #第一个1位
>bitpos w 1 1 1              #从第二个字符算起,第一个1位
>bitpos w 1 2 2             #从第三个字符算起,第一个1位

4.1、魔术指令 bitfield
[Bash shell] 纯文本查看 复制代码
>bitfield w get u4 0            #从第一位开始取,取4个位,结果是无符号数(u)
>bitfield w get u4 2            #从第三位开始取,取4个位,结果是无符号数(u)
>bitfield w get i2 3              #从第四位开始取,取2个位,结果是有符号数(i)
>bitfield w set u8 8 97        #从第八位开始,将接下来的8个位替换成无符号数97
>get w                                  #"hallo"
>bitfield w incrby u4 2 1      #从第三位开始,对接下来的4位无符号数+1

[Bash shell] 纯文本查看 复制代码
饱和截断SAT
>bitfield w overflow sat incrby u4 2 1      #从第三位开始,对接下来的4位无符号数+1,如果4个无符号数都为1,则不增加,保持最大值,返回为 最大值
失败不执行 FAIL
>bitfield w overflow fail incrby u4 2 1      #从第三位开始,对接下来的4位无符号数+1,如果4个无符号数都为1,则不执行,返回为 nil

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
tang588 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

tang588 发表于 2021-7-25 22:55
看不懂没关系支持支持
 楼主| tomcar 发表于 2021-7-26 22:12
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 00:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表