我們在使用springboot搭建微服務的時候,在很多時候還是需要redis的高速緩存來緩存一些數據,存儲一些高頻率訪問的數據,如果直接使用redis的話又比較麻煩,在這里,我們使用jedis來實現redis緩存來達到高效緩存的目的,接下來,讓我們一起來使用jedis來實現redis緩存
1.在pom.xml文件中添加依賴
<!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.2</version> </dependency>
2. 在springboot的配置文件中加入redis的配置信息
#redis jedis配置 # Redis數據庫索引(默認為0) spring.redis.database=0 # Redis服務器地址 spring.redis.host=10.100.140.84 # Redis服務器連接端口 spring.redis.port=6379 # Redis服務器連接密碼(默認為空) #spring.redis.password= # 連接池最大連接數(使用負值表示沒有限制) spring.redis.pool.max-active=200 # 連接池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=-1 # 連接池中的最大空閑連接 spring.redis.pool.max-idle=8 # 連接池中的最小空閑連接 spring.redis.pool.min-idle=0 # 連接超時時間(毫秒) spring.redis.timeout=0 #spring-session 使用 spring.session.store-type=none
3.創建jedis配置文件,配置文件的作用是在項目啟動的時候將jedis注入,接着我們就可以在其他類中獲取到JedisPool類的信息
@Configuration public class JedisConfig extends CachingConfigurerSupport{ private Logger logger = LoggerFactory.getLogger(JedisConfig.class); /** * SpringSession 需要注意的就是redis需要2.8以上版本,然后開啟事件通知,在redis配置文件里面加上 * notify-keyspace-events Ex * Keyspace notifications功能默認是關閉的(默認地,Keyspace 時間通知功能是禁用的,因為它或多或少會使用一些CPU的資源)。 * 或是使用如下命令: * redis-cli config set notify-keyspace-events Egx * 如果你的Redis不是你自己維護的,比如你是使用阿里雲的Redis數據庫,你不能夠更改它的配置,那么可以使用如下方法:在applicationContext.xml中配置 * <util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/> * @return */ @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.pool.max-active}") private int maxActive; @Value("${spring.redis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.pool.min-idle}") private int minIdle; @Value("${spring.redis.pool.max-wait}") private long maxWaitMillis; @Bean public JedisPool redisPoolFactory(){ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); jedisPoolConfig.setMaxTotal(maxActive); jedisPoolConfig.setMinIdle(minIdle); JedisPool jedisPool = new JedisPool(jedisPoolConfig,host,port,timeout,null); logger.info("JedisPool注入成功!"); logger.info("redis地址:" + host + ":" + port); return jedisPool; } }
接下來,我們啟動項目,gogogo
Jedis注入成功了!!!
然后我們可以定義一個工具類,用於對redis進行各種操作
這里我們通過@Autowired將JedisPool注入到工具類中,其他兩個是命名、序列化的類
這里,我們列舉一下平常最常用的幾個方法
//給某個key設值 public void set(String key, Object value) { Jedis client = getJedis(); try { byte[] keyBytes = serializer.serializeKey(keyNamingPolicy.getKeyName(key)); byte[] valueBytes = serializer.serializeValue(value); client.set(keyBytes, valueBytes); } finally { returnJedis(client); } } //根據key獲取value public Object get(String key) { Jedis client = getJedis(); try { byte[] keyBytes = serializer.serializeKey(keyNamingPolicy.getKeyName(key)); byte[] valueBytes = client.get(keyBytes); return serializer.deserializeValue(valueBytes); } finally { returnJedis(client); } } //根據鍵值獲取value public Object hashGet(String key, String field) { Jedis client = getJedis(); try { byte[] keyBytes = serializer.serializeKey(keyNamingPolicy.getKeyName(key)); byte[] fieldBytes = serializer.serializeKey(field); byte[] valueBytes = client.hget(keyBytes, fieldBytes); return serializer.deserializeValue(valueBytes); } finally { returnJedis(client); } } public void hashSet(String key, String field, Object value) { Jedis client = getJedis(); try { byte[] keyBytes = serializer.serializeKey(keyNamingPolicy.getKeyName(key)); byte[] fieldBytes = serializer.serializeKey(field); byte[] valueBytes = serializer.serializeValue(value); client.hset(keyBytes, fieldBytes, valueBytes); } finally { returnJedis(client); } } public Map<String, Object> hashAllGet(String key) { Jedis client = getJedis(); try { byte[] keyBytes = serializer.serializeKey(keyNamingPolicy.getKeyName(key)); Map<byte[], byte[]> map = client.hgetAll(keyBytes); Map<String, Object> valueMap = Maps.newHashMap(); Set<Map.Entry<byte[], byte[]>> valueSet = map.entrySet(); for (Map.Entry<byte[], byte[]> entry : valueSet) { valueMap.put(serializer.deserializeKey(entry.getKey()), serializer.deserializeValue(entry.getValue())); } return valueMap; } finally { returnJedis(client); } } //判斷key是否存在 public boolean existKey(String key) { Jedis client = getJedis(); try { byte[] keyBytes = serializer.serializeKey(keyNamingPolicy.getKeyName(key)); return client.exists(keyBytes); } finally { returnJedis(client); } }
在該項目中,我們發送短信驗證碼后會將驗證碼存在redis中去,然后校驗的時候會判斷用戶輸入的驗證碼和緩存中的驗證碼是否一致,達到目的。