问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

redis 怎么使自增长主键调过一段继续生成

发布网友 发布时间:2022-04-11 13:59

我来回答

2个回答

懂视网 时间:2022-04-11 18:21

INCR key

将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 操作。

可用版本:

>= 1.0.0

时间复杂度:

O(1)

返回值:

执行 INCR 命令之后 key 的值。

redis> SET page_view 20
OK
redis> INCR page_view
(integer) 21
redis> GET page_view # 数字值在 Redis 中以字符串的形式保存
"21"

计数器是 Redis 的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向 Redis 发送一个 INCR 命令。

比如在一个 web 应用程序中,如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键,并在每次用户点击页面时,执行一次自增操作即可。

比如用户名是 peter ,点击时间是 2012 年 3 月 22 日,那么执行命令 INCR peter::2012.3.22 。

可以用以下几种方式扩展这个简单的模式:

  • 可以通过组合使用 INCR 和 EXPIRE ,来达到只在规定的生存时间内进行计数(counting)的目的。

  • 客户端可以通过使用 GETSET 命令原子性地获取计数器的当前值并将计数器清零,更多信息请参考 GETSET 命令。

  • 使用其他自增/自减操作,比如 DECR 和 INCRBY ,用户可以通过执行不同的操作增加或减少计数器的值,比如在游戏中的记分器就可能用到这些命令。

  • 更多redis知识请关注redis入门教程栏目。

    热心网友 时间:2022-04-11 15:29

    数据库自增什么的麻烦死了,尤其是往后还需要考虑到分布式处理,然后偷了个懒,直接redis来搞起...

    下面上代码
    先定义个主键生成策略接口,往后方便扩展

    [java] view plain copy
    /**
    * 定义主键生成策略接口,以便修改扩展
    * @author LeiYong
    *
    */
    public interface KeyGenerate {
    /**
    * 生成String类型主键
    * @param em
    * @return
    */
    public String generateStringKey(KeyGenerateEnum em);
    /**
    * 生成long类型主键
    * @param em
    * @return
    */
    public Long generateLongKey(KeyGenerateEnum em);
    }

    接下来提供一个替补队员,基础的主键生成方案,采用随机数(Long)或UUID(String)方式生成

    [java] view plain copy
    /**
    * 基础主键生成策略,采用随机数或UUID+随机数
    * @author LeiYong
    *
    */
    public class BaseKeyGenerate implements KeyGenerate{
    @Override
    public String generateStringKey(KeyGenerateEnum em) {
    return StringUtil.getUUID()+StringUtil.getNonceStr(6);
    }
    @Override
    public Long generateLongKey(KeyGenerateEnum em) {
    return System.currentTimeMillis()*1000000+NumberUtil.random(6);
    }
    }

    主角Redis的缓存主键类登场

    [java] view plain copy
    /**
    * 采用Redis的方式产生自增长主键
    * @author LeiYong
    *
    */
    public class RedisKeyGenerate implements KeyGenerate{
    /**
    * Logger for this class
    */
    private final Logger logger = LoggerFactory.getLogger(RedisKeyGenerate.class);

    private final String SEQUENCE_KEY = "SEQ";
    @Autowired
    @Qualifier("redisClientSupport")
    private RedisClientSupport redisClientSupport;

    @Override
    public String generateStringKey(KeyGenerateEnum em) {
    Long key = generateLongKey(em);
    if (key!=null) {
    return key.toString();
    }
    //为了防止redis挂了程序能够继续运行
    return new BaseKeyGenerate().generateStringKey(em);
    }

    @Override
    public Long generateLongKey(KeyGenerateEnum em) {
    synchronized (em) {
    try {
    redisClientSupport.selectDB(SystemConfig.REDIS_INDEX_DB);
    Long key = redisClientSupport.incrementHash(SEQUENCE_KEY, em.name(), 1l);
    if (key != null) {
    return key;
    }
    } catch (CacheAccessException e) {
    logger.warn("generateStringKey(KeyGenerateEnum) - exception ignored", e); //$NON-NLS-1$
    }
    }
    //为了防止redis挂了程序能够继续运行
    return new BaseKeyGenerate().generateLongKey(em);
    }

    }
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    重磅|8月1日起 报关单的填法将重大改变 进出口权需要报关员么 宝宝被莫名的虫子咬了又红又肿又痒怎么? 北京疫情个为数是什么意思? 在做刀伤的手术时没有接上神经是医院的过错吗? 手术室收费项目有哪些 手术室的秘密:一台10万的手术,主刀医生拿多少?答案颠覆你的认知 阿里巴巴中修改产品信息只修改一小部分行吗?谢谢 可否给我一个阿里巴巴的序列号~谢谢了 阿里巴巴店铺产品搜索框代码谁有呢,给我发一下谢谢了! redis zset集合中的score值可以自增么 redis 使用自增一百万数据有多大 redis 自增计数器 重启会丢失否 redis 多条del命令可以一次执行吗 shirocas怎么做session共享redis tomcat 解决session共享有哪些方案 如何防止虚读,脏读,幻读 幻读的问题 MySQL 数据库中 left outer join 和 left join 什么区别 mysql的内链接和左右连接的区别 什么是数据的整体性?什么是数据的共享性?为什么要使数据有整体性和共享性题 什么是数据库中全体数据的和特征的描述 在数据库的三级模式结构中,描述数据库全局逻辑结构的是? 求mysql数据库删除语句! 现在要实现积分抽奖的功能,点击抽奖,会员积分,减10,怎么实现呀! PHP抽奖系统怎样保存奖品名称? redis抽奖次数校验 用redis可以在酒店管理系统中存放什么内容 redis 适合用在业务系统中吗 博学谷redis基础教程-28-sorted_set实现排行榜 redis处理数据问题 redis怎么实现条件查询 怎样在代码中实现redis的多条件查询 客户端查询redis数据库,条件怎么处理 redis遇到条件查询怎么办 redis 全文搜索怎么实现 数据需要按条件筛选 怎么设计redis缓存数据表 Redis 存一篇文章用什么类型?string 把用户的登录信息存放到redis中,通过token来取,那么每次ajax都需要token去验证码 jmeter如何提取redis中的token? 在高并发的核心技术中如何实现幂等性 php下载redis扩展,redis不同版本扩展包里面的文件不一样 小弟九月份考计算机二级vfp,帮忙!!! 什么是研究程序设计中计算机操作对象以及它们之间关系和运算的专门学科 线上Redis内存用爆了,怎么搞 redis 内存释放 集成部署对redis缓存失效有影响吗 redis 失效如何快速响应 java怎么模拟redis缓存超时 我配置了redis注解缓存,为什么不起作用