当前位置: 首页 > news >正文

redis实现全局唯一id

image

Redis 中的INCREMENT操作。

简单来说,Redis 的 INCREMENT 操作指的是对一个存储在 Redis 中的整数值进行“增加”的命令。这些命令是原子性(Atomic) 的,这是它们最核心、最重要的特性。

在深入命令之前,必须先理解“原子性”。原子性意味着一个操作是不可分割的。即使有多个客户端同时连接到 Redis 服务器并对同一个键(Key)进行增减操作,Redis 也会确保这些命令一个接一

个地顺序执行,而不会出现竞争条件(Race Condition)。

例如,如果键 mycounter 的值是 10,同时有 1000 个客户端执行 INCR mycounter 命令,最终的结果一定是 1010,绝对不会出现丢失任何一次增加的情况。

这使得 Redis 的 INCREMENT 命令成为实现高并发计数器的完美选择。

具体实现:

RedisIdWorker

package com.hmdp.utils;import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;@Component
public class RedisIdWorker {private static final long SEGIN_TIMESTAMP = 1735689600L;private static final int COUNT_BITS = 32;private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}public long nextId(String keyPrefix) {// 1.生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - SEGIN_TIMESTAMP;// 2.生成序列号,获取当前日期,自增长String data = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + data);// 3.拼接并返回return timestamp << COUNT_BITS | count;}
}

测试:

package com.hmdp;import com.hmdp.entity.Shop;
import com.hmdp.service.impl.ShopServiceImpl;
import com.hmdp.utils.CacheClient;
import com.hmdp.utils.RedisIdWorker;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;import java.util.concurrent.*;import static com.hmdp.utils.RedisConstants.CACHE_SHOP_KEY;@SpringBootTest
class HmDianPingApplicationTests {@Resourceprivate CacheClient cacheClient;@Resourceprivate ShopServiceImpl shopService;@Resourceprivate RedisIdWorker redisIdWorker;private ExecutorService es = Executors.newFixedThreadPool(500);@Testvoid testIdWorker() throws InterruptedException {CountDownLatch latch = new CountDownLatch(300);Runnable task = () ->{for(int i = 0;i < 100;i++){long id = redisIdWorker.nextId("order");System.out.println(id);}latch.countDown();};long start = System.currentTimeMillis();for(int i = 0;i < 300;i++){es.submit(task);}latch.await();long end = System.currentTimeMillis();System.out.println("time:" + (end - start));}@Testvoid testSaveShop() throws InterruptedException {Shop shop = shopService.getById(1L);cacheClient.setWithLogicalExpire(CACHE_SHOP_KEY + 1L,shop,10L, TimeUnit.SECONDS);}
}
http://www.sczhlp.com/news/107253/

相关文章:

  • 展示型网站一样做seo优化吗深圳做网站补贴
  • 高端网站登录入口威海公司注册
  • 免费自助建站哪个好手机中国官网
  • 备案的域名拿来做别的网站汉堡只做网站
  • 艾特软件 网站建设网站开发网
  • 福州建设公司网站公司做网站的费用怎么记账
  • 网站上的站点地图链接是这么做的潍坊做电商的网站
  • 四川省营山县西城建筑公司网站广饶网站定制
  • 站开发技术培训免费的网站或软件
  • wordpress 做网课网站西安市精神文明建设网站
  • 建设网站的制作步骤中国交通建设工程监督管理局网站
  • 网站设计制作价格怎么算广告公司起名用字大全
  • 网络营销基础 网站策划与网上营销企业网站的页面信息该如何排放
  • 欧美做视频网站有哪些校园网络建设
  • 购买完域名后怎么做网站东莞专业网站推广策划
  • 国际最好的摄影作品网站学仿网站
  • 表格识别技术:“唤醒”沉睡在纸质文档中的海量结构化数据
  • 吉林公司做网站网站建设的业务流程图
  • jsp网站开发教程杭州低价做网站
  • wordpress 禁止百度转码优化产品
  • 吕梁网站建设公司做外贸学习网站
  • 凡科快图品牌介绍无锡seo管理
  • aspcms 网站统计互联网大厂设计哪家口碑好
  • 南通网站制作价格网站原创内容
  • 网站费用怎么做会计分录模板建站总公司
  • 网站 服务器 域名wordpress豆瓣电影图书分享插件
  • 【大三下】资料,仅内部学习使用
  • fastboot工具的常见命令
  • 网站风格设计原则自己做网站还是公众号
  • 福州微信网站建设高质量摄影作品网站