首页 > 数据库 >Spring boot中使用实现Redis Lua计数器

Spring boot中使用实现Redis Lua计数器

时间:2024-09-30 15:01:08浏览次数:9  
标签:redis Spring boot Redis springframework current Lua 计数器 import

Spring boot中使用实现Redis Lua计数器

在Spring Boot中使用Redis Lua脚本实现计数器,可以通过以下步骤来完成。这个示例将展示如何使用Lua脚本在Redis中安全地增加计数器的值。

步骤 1: 添加依赖

首先,确保你的pom.xml文件中包含了Spring Data Redis和Lettuce的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>io.lettuce.core</groupId>
    <artifactId>lettuce-core</artifactId>
</dependency>

步骤 2: 配置Redis连接

spring.redis.host=localhost
spring.redis.port=6379

步骤 3: 编写Lua脚本

-- increment_counter.lua
local current = redis.call("GET", KEYS[1])
if not current then
    current = 0
else
    current = tonumber(current)
end
current = current + 1
redis.call("SET", KEYS[1], current)
return current

步骤 4: 在Spring Boot中调用Lua脚本

你可以使用RedisTemplate来执行Lua脚本。下面是一个示例服务类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class CounterService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private static final String INCREMENT_SCRIPT = "local current = redis.call(\"GET\", KEYS[1]) " +
            "if not current then current = 0 else current = tonumber(current) end " +
            "current = current + 1 " +
            "redis.call(\"SET\", KEYS[1], current) " +
            "return current";

    public Long incrementCounter(String key) {
        return redisTemplate.execute((connection) -> 
            connection.eval(
                INCREMENT_SCRIPT.getBytes(),
                redis.connection.RedisScriptOutputType.INTEGER,
                1,
                key.getBytes()
            )
        );
    }
}

步骤 5: 使用计数器服务

你可以在控制器或其他服务中使用CounterService来增加计数器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CounterController {

    @Autowired
    private CounterService counterService;

    @GetMapping("/increment/{key}")
    public Long increment(@PathVariable String key) {
        return counterService.incrementCounter(key);
    }
}

步骤 6: 测试计数器
启动你的Spring Boot应用并访问以下URL来测试计数器功能:

http://localhost:8080/increment/testKey

每次请求都会增加testKey的计数器值,并返回当前值。

总结

通过以上步骤,你已经成功地在Spring Boot应用中使用Redis和Lua脚本实现了一个简单的计数器。这种方法能够保证计数操作的原子性,避免了并发问题

标签:redis,Spring,boot,Redis,springframework,current,Lua,计数器,import
From: https://www.cnblogs.com/xianfengzhike/p/18441859

相关文章

  • pbootcms在线升级后伪静态分页url变成?page=xx问题
    在PbootCMS中,如果你想在网站首页右侧或列表页左侧调用特定栏目的标签(tags),可以使用 {pboot:tags} 标签来实现。下面详细介绍如何使用该标签以及具体参数的含义。使用 {pboot:tags} 标签语法html {pboot:tagsscode=2,5,8num=50}[tags:text]{/pboot:tags}参......
  • 实现在 PbootCMS 网站首页右侧或列表页左侧调用特定栏目的标签,并确保标签显示和链接正
    假设你想在网站首页右侧或列表页左侧调用特定栏目的标签,可以使用以下代码:HTML模板代码<!--调用指定栏目的标签--><divclass="tags-list">{pboot:tagsscode=2,5,8num=50}<ahref="[tags:url]"><span>[tags:text]</span></a>{/pboot:......
  • PbootCMS默认面包屑导航样式修改及自定义的设置方法
    在使用PbootCMS建站时,如果需要对系统默认的面包屑(breadcrumb)标签样式进行修改,可以通过自定义参数来实现。下面详细介绍如何使用 {pboot:position} 标签,并自定义相关的参数。自定义面包屑标签基本语法{pboot:position}[position:breadcrumb]{/pboot:position}......
  • PbootCMS出现登录失败,表单提交校验失败等情况怎么办?
    在使用PbootCMS过程中,可能会遇到一些登录问题,例如表单提交校验失败、登录界面锁定以及数据库目录权限写入不足等问题。以下是对这些问题的详细解决方案。一、表单提交校验失败问题描述:登入失败,表单提交校验失败。解决方法:检查服务器环境确认服务器环境是否符合Pboot......
  • pbootcms内容详情页标签调用
    在PbootCMS中,内容详情页标签用于展示文章的详细信息。以下是一张表格,列出了常用的内容详情页标签及其功能和用法。PbootCMS内容详情页标签一览表标签名功能描述用法示例[content:id]获取文章ID[content:id][content:title]获取文章标题[content:title][......
  • PBOOTCMS的水印功能如何使用?pbootcms设置的水印为何没生效?
    在PbootCMS中,水印功能主要用于给新上传的图片添加水印。如果你发现开启了水印功能但前端仍然没有水印,可能是因为以下几个原因:只对新上传的图片生效:水印功能仅对新上传的图片生效,之前上传的图片不会自动加上水印。水印配置未生效:可能是因为水印配置没有正确设置或生效。图片......
  • pbootcms列表如何置顶文章,istop不管用怎么办?
    在PbootCMS中,如果你想在列表中将某篇文章置顶,但发现后台设置了置顶后前端没有效果,这通常是由于前端调用标签的方式不正确。下面详细介绍如何使用PbootCMS的标签来实现文章置顶功能。调用置顶文章的方法1.只调用置顶的文章如果你只想调用置顶的文章,可以使用以下标签:{pb......
  • Redis 中Lua脚本的使用
    Redis中Lua脚本的使用Redis支持使用Lua脚本来执行原子操作,以下是一个简单的RedisLua脚本示例以及如何在Redis中使用它。示例:计数器这个脚本会增加一个指定键的计数器,并返回新的计数值。--increase_counter.lualocalkey=KEYS[1]--第一个参数是键localincrem......
  • 确保上传的缩略图在 PbootCMS 中保持清晰
     config/config.php 文件中的相关部分://缩略图配置'ico'=>array('max_width'=>'1920',//最大宽度1920'max_height'=>''//最大高度不填写代表不限制),清除缓存清除系统缓存修改完配置文件后,需要清除系统缓存,确保配置更新生效。在后台......
  • PbootCMS全站模板date时间标签/时间格式常见的8种调用方式
    为了更好地展示PbootCMS中不同时间格式的使用方法,可以将上述信息汇总成一个表格。以下是详细的表格,展示了列表页和内容详情页中不同的时间格式及其效果。时间格式汇总表标签名功能描述格式示例效果示例[list:date]列表页时间(默认格式)[list:date]2021-12-0609:1......