Redis一些常用的技术

文章目录

  • 第1关:Redis 事务与锁机制
  • 第2关:流水线
  • 第3关:发布订阅
  • 第4关:超时命令
  • 第5关:使用Lua语言


第1关:Redis 事务与锁机制

编程要求
根据提示,在右侧编辑器Begin-End补充代码,根据以下要求完成一个模拟一次银行卡支付扣款的流程:
1、当余额不足时,放弃所有被监控的键,返回false。
2、在余额扣除消费的金额,在支付金额里加上消费的金额。

测试说明
我会对你编写的代码进行测试:

测试输入:无;
预期输出:

支付成功
本次扣款10元,余额为90元
开始你的任务吧,祝你成功!
示例代码如下:

package com.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.util.List;
public class TestRedis {
    private static String host = "127.0.0.1";
    private static int port = 6379;
    private static Jedis jedis = new Jedis(host, port);
    public static boolean payMent(int deduction) throws InterruptedException {
        int balance;  // 余额
        //设置余额金额
        jedis.set("balance", "100");
        jedis.set("deduction", "0");
        //监控扣款和余额
        jedis.watch("balance", "deduction");
        /***********Begin***********/
        balance = Integer.parseInt(jedis.get("balance"));
        // 余额不足
        if (balance < deduction) {
            jedis.unwatch();  // 放弃所有被监控的键
            System.out.println("对不起,你的余额不足");
            return false;
        }
        Transaction transaction = jedis.multi();
        // 扣钱
        transaction.decrBy("balance", deduction);
        Thread.sleep(5000);  // 在外部修改 balance 或者 debt
        transaction.incrBy("deduction", deduction);
        // list为空说明事务执行失败
        List<Object> list = transaction.exec();
        return !list.isEmpty();
        /***********End***********/
    }
    public static void main(String[] args) throws InterruptedException {
        boolean resultValue = payMent(10);
        if (resultValue==true){
            System.out.println("支付成功");
            int balance = Integer.parseInt(jedis.get("balance"));
            int deduction = Integer.parseInt(jedis.get("deduction"));
            System.out.printf("本次扣款"+deduction+"元,余额为"+balance+"元");
        }else{
            System.out.println("支付失败");
        }
        jedis.close();
    }
}

在这里插入图片描述

第2关:流水线

编程要求
根据提示,在右侧编辑器Begin-End补充代码,按照以下要求开启一次流水线技术:

开启流水线。
测试十万条读写操作,设置 key 值为 key0 、 key1 、 key2 …key99998、key99999,对应 value 值为 value0 、value1、value2…value99998、value99999。
结束流水线。
测试说明
我会对你编写的代码进行测试:

测试输入:无;
预期输出:

开启流水线
消耗时间:XXX毫秒
关闭流水线
流水线成功完成!
开始你的任务吧,祝你成功!
示例代码如下:

package com.test;
import redis.clients.jedis.*;
import java.util.List;
public class RedisPipeline {
    public  boolean pipeline() {
        String redisHost = "127.0.0.1";
        int redisPort = 6379;
        Jedis jedis = new Jedis(redisHost, redisPort);
        jedis.flushDB();
        /**********Begin**********/
        long start = System.currentTimeMillis();
        // 开启流水线
        Pipeline pipeline = jedis.pipelined();
        System.out.println("开启流水线");
        // 测试十万条读写操作
        for (int i = 0; i < 100000; i++) {
            pipeline.set("key"+i,"value"+i);
            pipeline.get("key"+i);
        }
        long end = System.currentTimeMillis();
        //关闭流水线
        pipeline.close();
        System.out.println("消耗时间:"+(end-start)+"毫秒");
        System.out.println("关闭流水线");
        /**********End**********/
        return true;
    }
}

在这里插入图片描述

第3关:发布订阅

编程要求
根据提示,在右侧编辑器Begin-End补充代码,按照以下要求:

在SubThread类中订阅指定频道redis。
测试说明
我会对你编写的代码进行测试:

测试输入:quit;
预期输出:

订阅redis, 订阅频道为 redis, 线程将被阻塞
订阅redis频道成功, 频道为 redis, 订阅频道为 1
请输入传输的信息:
关闭程序
开始你的任务吧,祝你成功!
示例代码如下:

package com.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class SubThread extends  Thread {
    private final JedisPool jedisPool;
    private final Subscriber subscriber = new Subscriber();
    private final String channel = "redis";
    public SubThread(JedisPool jedisPool) {
        super("SubThread");
        this.jedisPool = jedisPool;
    }
    @Override
    public void run() {
        System.out.println(String.format("订阅redis, 订阅频道为 %s, 线程将被阻塞", channel));
        Jedis jedis = null;
        try {
            /************* Begin ***************/
            jedis = jedisPool.getResource();
            jedis.subscribe(subscriber, channel);
             /************* End ***************/
        } catch (Exception e) {
            System.out.println(String.format("订阅频道错误, %s", e));
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }
}

第4关:超时命令

编程要求
根据提示,在右侧编辑器Begin-End补充代码,按照以下要求使用 Spring 操作 Redis 超时命令过程:

创建键值对:key 值为“今天你吃了吗?”
获取 key 值
设置 key 的过期时间为 5 秒
测试说明
我会对你编写的代码进行测试:

测试输入:无;
预期输出:

今天你吃了吗?
null
开始你的任务吧,祝你成功!
示例代码如下:

package com.redis;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.concurrent.TimeUnit;
public class OverTimeRedisTest {
    @SuppressWarnings({ "unchecked", "rawtypes", "resource" })
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        RedisTemplate redisTemplate=applicationContext.getBean(RedisTemplate.class);
        redisTemplate.execute((RedisOperations ops) -> {
       
       /************Begin************/
        ops.boundValueOps("key").set("今天你吃了吗?");
        System.out.println(ops.boundValueOps("key").get());
        ops.expire("key",5L, TimeUnit.SECONDS);
        /************End************/
        //睡眠6秒,使得key值过期
        try {
            Thread.sleep(6000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        //获取key值
        System.out.println(ops.boundValueOps("key").get());
        //结束所有线程,退出系统
        System.exit(0);
        return null;
        });
    }
}

在这里插入图片描述

第5关:使用Lua语言

编程要求
根据提示,在右侧编辑器 Begin - End 处补充代码,根据以下要求完成一次手机销售库存的操作:

编写 ItemRedisTest.lua 文件,判断销售量是否比库存数量多,如果库存数量大于这次销售量,将新的库存数量更新到原来的 key 值上。
编写 ItemRedisTest.java 文件,使用 BufferedReader 读取ItemRedisTest.lua 文件,使用 eval 命令执行文件里的字符串,设置手机销售量为10。
ItemRedisTest.lua 地址为:/data/workspace/myshixun/step5/ItemRedisTest.lua
测试说明
我会对你编写的代码进行测试:

测试输入:无;
预期输出:

手机库存剩余:90
开始你的任务吧,祝你成功!
代码示例如下:

package com.redis;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import redis.clients.jedis.Jedis;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class ItemRedisTest {
    public static void main(String[] args) throws IOException {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        RedisTemplate redisTemplate=applicationContext.getBean(RedisTemplate.class);
        Jedis jedis=(Jedis)redisTemplate.getConnectionFactory().getConnection().getNativeConnection();
        jedis.set("phone_item_stock", "100");
         /************Begin************/
        BufferedReader in= new BufferedReader(new FileReader("/data/workspace/myshixun/step5/ItemRedisTest.lua"));
        String context =null;
        String script="";
        while (null != (context = in.readLine())){
            script+=context+"\n";
        }
        Object obj =  jedis.eval(script, 1,"phone_item_stock","10");
        /************End************/
        
        System.out.println("手机库存剩余:"+obj);
        //关闭连接
        jedis.close();
        System.exit(0);
    }
}

之后在命令行中输入下列代码:

vim /data/workspace/myshixun/step5/ItemRedisTest.lua

编辑该文件内容
文件修改完之后的内容

local count = redis.call('get', KEYS[1])
local a=tonumber(count)
local b=tonumber(ARGV[1])
---Begin
if a>=b then
    redis.call('set',KEYS[1],count-b)
    return redis.call('get', KEYS[1])
end
---End

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/255941.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新AI创作系统ChatGPT系统源码+DALL-E3文生图+支持AI绘画+GPT语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

Rust与python联动进行多线程跑数据

最近有个学弟想请教我联动多线程爬取数据的案例&#xff0c;看了以前的模版没有合适的&#xff0c;我就利用空闲时间&#xff0c;专门给他写了一段模版作为参考。这里遇到注意的是需要代理IP介入&#xff0c;才能让多线程爬取减少网站风控限制。 以下是一个使用 Rust 编写的爬虫…

【NI-RIO入门】使用LabVIEW进行数据采集测量

于ni kb摘录 选择合适的编程模式 CompactRIO系统具有至少两个用户可选模式。某些CompactRIO型号具有附加的用户可选模式&#xff0c;可以在实时NI-DAQmx中进行编程。请参考本文以判断您的CompactRIO是否能够使用实时NI-DAQmx。将目标添加到项目后&#xff0c;将提示您选择要使…

函数torch.bincount( )的用法

torch.bincount()函数是PyTorch中的一个函数&#xff0c;用于计算一维整数张量中每个非负整数值出现的频次 函数的用法 &#xff1a; torch.bincount(input, weightsNone, minlength0) → Tensor 参数&#xff1a; input&#xff1a;输入的一维整数张量weights&#xff08;…

2024免费mac苹果电脑系统电脑管家CleanMyMac X

macOS已经成为最受欢迎的桌面操作系统之一&#xff0c;它提供了直观、简洁的用户界面&#xff0c;使用户可以轻松使用和管理系统。macOS拥有丰富的应用程序生态系统&#xff1b;还可以与其他苹果产品和服务紧密协作&#xff0c;如iPhone、iPad&#xff0c;用户可以通过iCloud同…

CompleteFuture与Future的比较

CompleteFuture的介绍CompleteFuture的特点CompleteFuture的应用场景CompletableFuture的优缺点Future的介绍Future的特点Future的应用场景Future的优缺点CompletableFuture和Future的区别CompletableFuture和Future的关联关系CompletableFuture和Future的使用示例CompletableF…

基于点云去滤除灰尘的滤波算法调研

背景 激光雷达在恶劣天气下会影响感知识别的精度,造成误差,将灰尘,雨雪误识别为障碍物,为了降低对灰尘的误检,因此调研相关的灰尘滤波算法。 方法1 反射强度滤波+半径异常值移除 Design of a LIOR-Based De-Dust Filter for LiDAR Sensors inOff-Road Vehicles 1 上文中…

卷积神经网络的学习与实现

基于matlab的卷积神经网络(CNN)讲解及代码_matlab中如何查看cnn损失函数-CSDN博客 可以看到与BP神经网络相比&#xff0c;卷积神经网络更加的复杂&#xff0c;这里将会以cnn作为学习案例。 1.经典反向传播算法公式详细推导 这里引用经典反向传播算法公式详细推导_反向目标公…

关联规则 FP-Growth算法

FP-Growth算法 FP-growth 算法思想 FP-growth算法是韩家炜老师在2000年提出的关联分析算法&#xff0c;它采取如下分治策略: 将提供频繁项集的数据库压缩到一棵频繁模式树 (FP-Tree)但仍保留项集关联信息。FP-growth算法是对Apriori方法的改进。生成一个频繁模式而不需要生成…

SQLSERVER数据库主要状态和切换路径

前言 一个SQLSERVER数据库会处于很多种状态&#xff0c;例如 ONLINE 、RESTORING 、RECOVERING 、RECOVERY_PENDING 、SUSPECT、EMERGENCY 、OFFLINE等等。 只有在ONLINE的状态下&#xff0c;数据库才能被正常访问。 下图主要反映了数据库的主要状态之间的切换路径 下面说一…

【MAC】M2 安装mysql

一、docker下载地址 下载地址 二、安装docker完成 三、安装mysql 一、拉取镜像 # 拉取镜像 docker pull mysql# 或者 docker pull mysql:latest# 以上两个命令是一致的&#xff0c;默认拉取的就是 latest 版本的# 我们还可以用下面的命令来查看可用版本&#xff1a; docker…

数据结构(Chapter Two -02)—顺序表基本操作实现

在前一部分我们了解线性表和顺序表概念&#xff0c;如果有不清楚可以参考下面的博客&#xff1a; 数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客 首先列出线性表的数据结构&#xff1a; #define MaxSize 50 //定义顺序表最大长度 typedef struct{ElemType data…

HarmonyOS4.0从零开始的开发教程19HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十七&#xff09;HarmonyOS应用/元服务上架 概述 当您开发、调试完HarmonyOS应用/元服务&#xff0c;就可以前往AppGallery Connect申请上架&#xff0c;华为审核通过后&#xff0c;用户即可在华为应用市场获取您的HarmonyOS应用/元服务。 HarmonyOS会…

xxl-job 分布式调度学习笔记

1.概述 1.1什么是任务调度 业务场景&#xff1a; 上午10点&#xff0c;下午2点发放一批优惠券 银行系统需要在信用卡到期还款日的前三天进行短信提醒 财务系统需要在每天凌晨0:10分结算前一天的财务数据&#xff0c;统计汇总 不同系统间的数据需要保持一致&#xff0c;这时…

3.2 内容管理模块 - 课程分类、新增课程、修改课程

内容管理模块-课程分类、新增课程、修改课程 文章目录 内容管理模块-课程分类、新增课程、修改课程一、课程分类1.1 课程分类表1.2 查询树形结构1.2.1 表自连接1.2.2 SQL递归 1.3 Mapper1.4 Service1.5 Controller1.6 效果图 二、添加课程2.1 需求分析2.2 数据表2.2.1 课程基础…

html之CSS的高级选择器应用

文章目录 一、CSS高级选择器有哪些呢&#xff1f;二、高级选择器的应用1、层次选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器 2、结构伪类选择器&#xff08;不常用&#xff09;3、属性选择器E[attr]E[attrval]E[attr^val]E[attr$val]E[attr*val] 一、CSS高级选择器有…

LeetCode 每日一题 Day 13 || BFS

2415. 反转二叉树的奇数层 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &#xff0c;那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。 反转后&#xff0c;返回树的根…

NLP论文阅读记录-ACL 2023 | 10 Best-k Search Algorithm for Neural Text Generation

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1优势2.2 挑战 三.本文方法3.1 并行探索3.2 时间衰变3.3堆修剪3.4 模型得分 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果 五 总结 前言 用于神经文本生成…

安全生产隐患排查治理信息化系统软件

安全隐患排查系统实现对重大危险源企业、安全隐患信息的登记、整改、复查、分类和统计。系统涵盖了安全隐患排查整治工作的各项基本内容&#xff0c;实现以安全隐患排查整治业务流为主线&#xff0c;处理流程简洁清晰、快速灵活&#xff1b;以排查整治流程为干线&#xff0c;快…

Linux--学习记录(3)

G重要编译参数 -g&#xff08;GDB调试&#xff09; -g选项告诉gcc产生能被GNU调试器GDB使用的调试信息&#xff0c;以调试程序编译带调试信息的可执行文件g -g hello.c -o hello编译过程&#xff1a; -E&#xff08;预处理&#xff09; g -E hello.c -o hello.i-S&#xff08;编…