第一章 Jedis 測試
jedis是redis的java版本的客戶端實現。
1.1.Jedis所需要的jar包
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
1.2 連接Redis注意事項
- 禁用Linux的防火牆:Linux(CentOS7)裏執行命令systemctl stop/disable firewalld.service
- redis.conf中註釋掉bind 127.0.0.1 ,然後 protected-mode no
- 雲服務器有的還需要設置安全組端口,開啓6379端口
1.3 Jedis常用操作
創建測試程序
import redis.clients.jedis.Jedis; public class Demo01 { public static void main(String[] args) { Jedis jedis = new Jedis("192.168.137.3",6379); String pong = jedis.ping(); System.out.println("連接成功:"+pong); jedis.close(); } }
Jedis-API
//操作zset @Test public void demo5() { //創建Jedis對象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.zadd("china",100d,"shanghai"); Set<String> china = jedis.zrange("china", 0, -1); System.out.println(china); jedis.close(); } //操作hash @Test public void demo4() { //創建Jedis對象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.hset("users","age","20"); String hget = jedis.hget("users", "age"); System.out.println(hget); jedis.close(); } //操作set @Test public void demo3() { //創建Jedis對象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.sadd("names","lucy"); jedis.sadd("names","mary"); Set<String> names = jedis.smembers("names"); System.out.println(names); jedis.close(); } //操作list @Test public void demo2() { //創建Jedis對象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.lpush("key1","lucy","mary","jack"); List<String> values = jedis.lrange("key1", 0, -1); System.out.println(values); jedis.close(); } //操作key string @Test public void demo1() { //創建Jedis對象 Jedis jedis = new Jedis("112.16.10.11",6379); //添加 key-value jedis.set("name","lucy"); //獲取 String name = jedis.get("name"); System.out.println(name); //設置多個key-value jedis.mset("k1","v1","k2","v2"); List<String> mget = jedis.mget("k1", "k2"); System.out.println(mget); Set<String> keys = jedis.keys("*"); for(String key : keys) { System.out.println(key); } jedis.close(); }
第二章 Jedis實例
1.1 完成一個手機驗證碼功能
要求:
1、輸入手機號,點擊發送後隨機生成6位數字碼,2分鐘有效
2、輸入驗證碼,點擊驗證,返回成功或失敗
3、每個手機號每天只能輸入3次
設計
public class PhoneCode { public static void main(String[] args) { //模擬驗證碼發送 //verifyCode("13678765435"); //模擬驗證碼校驗 getRedisCode("13678765435","447005"); } //3 驗證碼校驗 public static void getRedisCode(String phone,String code) { //從redis獲取驗證碼 Jedis jedis = new Jedis("112.16.10.11",6379); //驗證碼key String codeKey = "VerifyCode"+phone+":code"; String redisCode = jedis.get(codeKey); //判斷 if(redisCode.equals(code)) { System.out.println("成功"); }else { System.out.println("失敗"); } jedis.close(); } //2 每個手機每天只能發送三次,驗證碼放到redis中,設置過期時間120 public static void verifyCode(String phone) { //連接redis Jedis jedis = new Jedis("112.16.10.11",6379); //拼接key //手機發送次數key String countKey = "VerifyCode"+phone+":count"; //驗證碼key String codeKey = "VerifyCode"+phone+":code"; //每個手機每天只能發送三次 String count = jedis.get(countKey); if(count == null) { //沒有發送次數,第一次發送 //設置發送次數是1 jedis.setex(countKey,24*60*60,"1"); } else if(Integer.parseInt(count)<=2) { //發送次數+1 jedis.incr(countKey); } else if(Integer.parseInt(count)>2) { //發送三次,不能再發送 System.out.println("今天發送次數已經超過三次"); jedis.close(); } //發送驗證碼放到redis裏面 String vcode = getCode(); jedis.setex(codeKey,120,vcode); jedis.close(); } //1 生成6位數字驗證碼 public static String getCode() { Random random = new Random(); String code = ""; for(int i=0;i<6;i++) { int rand = random.nextInt(10); code += rand; } System.out.println(code); return code; } }
第三章 與Spring Boot整合
Spring Boot整合Redis非常簡單,只需要按如下步驟整合即可
3.1 整合步驟
1、在pom.xml文件中引入redis相關依賴
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- spring2.X集成redis所需common-pool2--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency>
2、application.properties配置redis配置
#Redis服務器地址 spring.redis.host=112.16.10.11 #Redis服務器連接端口 spring.redis.port=6379 #Redis數據庫索引(默認爲0) spring.redis.database= 0 #連接超時時間(毫秒) spring.redis.timeout=1800000 #連接池最大連接數(使用負值表示沒有限制) spring.redis.lettuce.pool.max-active=20 #最大阻塞等待時間(負數表示沒限制) spring.redis.lettuce.pool.max-wait=-1 #連接池中的最大空閒連接 spring.redis.lettuce.pool.max-idle=5 #連接池中的最小空閒連接 spring.redis.lettuce.pool.min-idle=0
3、添加redis配置類
@EnableCaching @Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer);
//value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解決查詢緩存轉換異常的問題 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解決亂碼的問題),過期時間600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }
4、測試一下
RedisTestController中添加測試方法
@RestController @RequestMapping("/redisTest") public class RedisTestController { @Autowired private RedisTemplate redisTemplate; @GetMapping public String testRedis() { //設置值到redis redisTemplate.opsForValue().set("name","lucy"); //從redis獲取值 String name = (String)redisTemplate.opsForValue().get("name"); return name; } }
瀏覽器訪問:http://localhost:8080/redisTest
顯示 lucy
在redis客戶端中