使用redis獲取自增序列號實現(xiàn)方式
前言
Redis作為時下熱門的緩存數(shù)據(jù)庫,由于單線程、直接存取與內(nèi)存中,所以速度很快很高效。redis的使用場景也非常多樣化,常見的是作為優(yōu)秀的緩存中間件,減輕數(shù)據(jù)庫壓力。
近期在項目中使用了redis獲取有序的序列號,作為業(yè)務單號,非常常見,手里的項目有springBoot也有SpringMvc ,所以在此做下總結(jié)
項目實例
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封裝度更低,更加原生態(tài),操作方式和一些方法更接近于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; } }
總結(jié)
以上未考慮到redis集群的情況,常規(guī)生成序列號是夠用了,每次獲取序列號的時間也在1毫秒左右,非常高效,同時列出其他生成連續(xù)號段的方法。
1.取mysql自增主鍵id,每次插入前查詢當前庫max(id) ,優(yōu)點:簡單,缺點:增加數(shù)據(jù)庫查詢次數(shù),高并發(fā)考慮maxid與實際值不一致情況
2.創(chuàng)建序列號的表,存儲序列值,通過添加版本號字段或加鎖控制寫入 優(yōu)點:準確 缺點:效率低
好了,這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
redis事務執(zhí)行常用命令及watch監(jiān)視詳解
這篇文章主要為大家介紹了redis事務執(zhí)行常用命令及watch監(jiān)視詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11基于Redis實現(xiàn)延時隊列的優(yōu)化方案小結(jié)
本文主要介紹了基于Redis實現(xiàn)延時隊列的優(yōu)化方案小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07淺談一下如何保證Redis緩存與數(shù)據(jù)庫的一致性
這篇文章主要介紹了一下如何保證Redis緩存與數(shù)據(jù)庫的一致性,今天這篇文章就帶你詳細了解一下四種同步策略,需要的朋友可以參考下2023-03-03