使用redis获取自增序列号实现方式

 更新时间:2023年12月07日 09:58:43   作者:留守的小柯基  
这篇文章主要介绍了使用redis获取自增序列号实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

Redis作为时下热门的缓存数据库,由于单线程、直接存取与内存中,所以速度很快很高效。redis的使用场景也非常多样化,常见的是作为优秀的缓存中间件,减轻数据库压力。

近期在项目中使用了redis获取有序的序列号,作为业务单号,非常常见,手里的项目有springBoot也有SpringMvc ,所以在此做下总结

项目实例

1.SpringBoot

1.pom文件引入

springBoot有对redis的封装插件,直接按以下引入即可:

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

2.yml或者properties配置redis连接的相关信息

#redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.timeout=3000
spring.redis.password=shit

3.添加redis配置类,可以实例化redisTemplate,设置缓存失效时间等,以及redis连接池等,这里从简了

@Configuration
public class RedisConfig {
	 
	 @Bean
	 public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
		  StringRedisTemplate template = new StringRedisTemplate(factory);
		  //序列化方式 
		  Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
		  ObjectMapper objectMapper = new ObjectMapper();
		  objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		  objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		  jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
		  template.setValueSerializer(jackson2JsonRedisSerializer);
		  template.afterPropertiesSet();
		  return template;
	 }
	 
	 
}

4.按照key获取递增的序列号

@Configuration
public class RedisConfig {
	 
	 @Bean
	 public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
		  StringRedisTemplate template = new StringRedisTemplate(factory);
		  //序列化方式 
		  Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
		  ObjectMapper objectMapper = new ObjectMapper();
		  objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		  objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		  jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
		  template.setValueSerializer(jackson2JsonRedisSerializer);
		  template.afterPropertiesSet();
		  return template;
	 }
	 
	 
}

2.springMVC

springMVC通常引入jedis包来进行redis相关的操作,和上诉spring-boot-starter-data-redis相比,jedis封装度更低,更加原生态,操作方式和一些方法更接近于redis命令操作。

1.pom文件引入

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.2.1</version>
        </dependency>

2.redis连接配置

redis.host=127.0.0.1
redis.port=6379
redis.maxWait=1000000
redis.password=shit
redis.maxIdle=300
redis.maxTotal=60000

3.在spring配置文件中实例化对象

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}"/> 
        <property name="maxActive" value="${redis.maxTotal}"/> 
        <property name="testOnBorrow" value="true"/> 
    </bean>

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
        <constructor-arg name="host" value="${redis.host}"/>
        <constructor-arg name="port" value="${redis.port}" type="int"/>
        <constructor-arg name="timeout" value="${redis.maxWait}"/>
        <constructor-arg name="password" value="${redis.password}"/>
    </bean>

4.编写一个redis操作的工具类,

@Component
public class JedisUtil {
	 protected final static Logger logger = Logger.getLogger(JedisUtil.class);
	 
	 private static JedisPool jedisPool;
	 
	 @Autowired(required = true)
	 public void setJedisPool(JedisPool jedisPool) {
		  JedisUtil.jedisPool = jedisPool;
	 }
	
     /**
	  * 获取自增的序列号
	  *
	  * @param key redis主键
	  * @return
	  */
	 public static String getIncreNum(String key) {
		  
		  String value = null;
		  Jedis jedis = null;
		  try {
			   jedis = jedisPool.getResource();
			   value = jedis.incrBy(key, 1).toString();
		  } catch (Exception e) {
			   logger.warn("getList " + key + " = " + value);
		  } finally {
			   jedisPool.returnResource(jedis);
		  }
		  return value;
	 }
}

总结

以上未考虑到redis集群的情况,常规生成序列号是够用了,每次获取序列号的时间也在1毫秒左右,非常高效,同时列出其他生成连续号段的方法。

1.取mysql自增主键id,每次插入前查询当前库max(id) ,优点:简单,缺点:增加数据库查询次数,高并发考虑maxid与实际值不一致情况

2.创建序列号的表,存储序列值,通过添加版本号字段或加锁控制写入 优点:准确 缺点:效率低

好了,这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis数据库的应用场景介绍

    Redis数据库的应用场景介绍

    这篇文章主要介绍了Redis数据库的应用场景介绍,本文讲解了MySql+Memcached架构的问题、Redis常用数据类型、Redis数据类型应用和实现方式、Redis实际应用场景等内容,需要的朋友可以参考下
    2015-06-06
  • 详解Redis如何保证接口的幂等性

    详解Redis如何保证接口的幂等性

    如何防止接口中同样的数据提交,以及如何保证消息不被重复消费,这些都是shigen在学习的过程中遇到的问题,今天,趁着在学习redis的间隙,我写了一篇文章进行简单的实现,需要的朋友可以参考下
    2023-11-11
  • 聊一聊Redis与MySQL双写一致性如何保证

    聊一聊Redis与MySQL双写一致性如何保证

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。本文给大家分享Redis与MySQL双写一致性该如何保证,感兴趣的朋友一起看看吧
    2021-06-06
  • Redis如何使用lua脚本实例教程

    Redis如何使用lua脚本实例教程

    这篇文章主要给大家介绍了关于Redis如何使用lua脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • redis事务执行常用命令及watch监视详解

    redis事务执行常用命令及watch监视详解

    这篇文章主要为大家介绍了redis事务执行常用命令及watch监视详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 缓存替换策略及应用(以Redis、InnoDB为例)

    缓存替换策略及应用(以Redis、InnoDB为例)

    本文以Redis、InnoDB为例给大家讲解缓存替换策略及应用,本文给大家提到五种置换策略,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • 基于Redis实现延时队列的优化方案小结

    基于Redis实现延时队列的优化方案小结

    本文主要介绍了基于Redis实现延时队列的优化方案小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • redis删除指定key的实现步骤

    redis删除指定key的实现步骤

    本文主要介绍了redis删除指定key的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Redis Cluster 字段模糊匹配及删除

    Redis Cluster 字段模糊匹配及删除

    在数据库内我们可以通过like关键字、%、*或者REGEX关键字进行模糊匹配。而在Redis内我们如何进行模糊匹配呢?本文就来介绍一下
    2021-05-05
  • 浅谈一下如何保证Redis缓存与数据库的一致性

    浅谈一下如何保证Redis缓存与数据库的一致性

    这篇文章主要介绍了一下如何保证Redis缓存与数据库的一致性,今天这篇文章就带你详细了解一下四种同步策略,需要的朋友可以参考下
    2023-03-03

最新评论