小言_互联网的博客

【Redis 2】入门

249人阅读  评论(0)

一、百度百科 

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

二、Redis下载

三、Linux中安装Redis

1、上传、解压

Redis一般安装在Linux环境下,开启虚拟机,通过xftp将redis压缩包上传到Linux服务器,并进行解压。

2、修改redis.conf配置文件,使其在后台启动

四、Java调用redis

1、导入pom


  
  1. <dependency>
  2. <groupId>redis.clients </groupId>
  3. <artifactId>jedis </artifactId>
  4. <version>3.2.0 </version>
  5. </dependency>

 2、编写Java主方法

调用Redis中的ping方法,惊现异常:

(1)开始的时候以为是防火墙的问题,后来通过查看redis状态发现IP地址不对,不应该是127.0.0.1

(2)修改redis.conf

注意:需要注意的是在修改redis.conf时,①注掉bind 127.0.0.1;②需要将本机访问保护模式设置为no

3、再次执行主方法,执行成功!

五、五大数据类型代码实例


  
  1. package com.guor.redis;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.List;
  4. import java.util.Set;
  5. public class JedisTest01 {
  6. public static void main(String[] args) {
  7. test05();
  8. }
  9. private static void test01(){
  10. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  11. String value = jedis.ping();
  12. System.out.println(value);
  13. //添加
  14. jedis.set( "name", "GooReey");
  15. //获取
  16. String name = jedis.get( "name");
  17. System.out.println(name);
  18. jedis.set( "age", "30");
  19. jedis.set( "city", "dalian");
  20. //获取全部的key
  21. Set<String> keys = jedis.keys( "*");
  22. for(String key : keys){
  23. System.out.println(key+ " --> "+jedis.get(key));
  24. }
  25. //加入多个key和value
  26. jedis.mset( "name1", "zs", "name2", "ls", "name3", "ww");
  27. List<String> mget = jedis.mget( "name1", "name2");
  28. System.out.println(mget); //[zs, ls]
  29. }
  30. //list
  31. private static void test02(){
  32. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  33. jedis.lpush( "key1", "01", "02", "03");
  34. List<String> values = jedis.lrange( "key1", 0,- 1);
  35. System.out.println(values); //[03, 02, 01]
  36. }
  37. //set
  38. private static void test03(){
  39. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  40. jedis.sadd( "username", "zs", "ls", "ww");
  41. Set<String> names = jedis.smembers( "username");
  42. System.out.println(names); //[ww, zs, ls]
  43. }
  44. //hash
  45. private static void test04(){
  46. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  47. jedis.hset( "users", "age", "20");
  48. String hget = jedis.hget( "users", "age");
  49. System.out.println(hget);
  50. }
  51. //zset
  52. private static void test05(){
  53. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  54. jedis.zadd( "china", 100d, "shanghai");
  55. Set<String> names = jedis.zrange( "china", 0,- 1);
  56. System.out.println(names); //[shanghai]
  57. }
  58. }

六、手机验证码功能代码实例


  
  1. package com.guor.redis;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.Random;
  4. public class PhoneCode {
  5. public static void main(String[] args) {
  6. verifyCode( "10086"); //795258
  7. getRedisCode( "10086", "795258"); //success.
  8. }
  9. //1、生成6位数字验证码
  10. public static String getCode(){
  11. Random random = new Random();
  12. String code = "";
  13. for ( int i = 0; i < 6; i++) {
  14. int rand = random.nextInt( 10);
  15. code += rand;
  16. }
  17. return code; //849130
  18. }
  19. //2、每个手机每天只能发送三次,验证码放到redis中,设置过期时间
  20. public static void verifyCode(String phone){
  21. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  22. //拼接key
  23. //手机发送次数key
  24. String countKey = "VerifyCode" + phone + ":count";
  25. //验证码key
  26. String codeKey = "VerifyCode" + phone + ":code";
  27. //每个手机每天只能发送三次
  28. String count = jedis.get(countKey);
  29. if(count == null){
  30. //设置过期时间
  31. jedis.setex(countKey, 24* 60* 60, "1");
  32. } else if(Integer.parseInt(count)<= 2){
  33. //发送次数+1
  34. jedis.incr(countKey);
  35. } else if(Integer.parseInt(count)> 2){
  36. System.out.println( "今天的发送次数已经超过三次");
  37. jedis.close();
  38. }
  39. String vCode = getCode();
  40. jedis.setex(codeKey, 120,vCode);
  41. jedis.close();
  42. }
  43. //3、验证码校验
  44. public static void getRedisCode(String phone, String code){
  45. //从redis中获取验证码
  46. Jedis jedis = new Jedis( "192.168.194.131", 6379);
  47. //验证码key
  48. String codeKey = "VerifyCode" + phone + ":code";
  49. String redisCode = jedis.get(codeKey);
  50. if(redisCode.equals(code)){
  51. System.out.println( "success.");
  52. } else{
  53. System.out.println( "error");
  54. }
  55. jedis.close();
  56. }
  57. }

当超过三次时: 

七、SpringBoot整合Redis

1、建工程,引入pom


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0 </modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot </groupId>
  7. <artifactId>spring-boot-starter-parent </artifactId>
  8. <version>2.2.1.RELEASE </version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.guor </groupId>
  12. <artifactId>redisspringboot </artifactId>
  13. <version>0.0.1-SNAPSHOT </version>
  14. <name>redisspringboot </name>
  15. <description>Demo project for Spring Boot </description>
  16. <properties>
  17. <java.version>1.8 </java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot </groupId>
  22. <artifactId>spring-boot-starter-web </artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot </groupId>
  26. <artifactId>spring-boot-starter-test </artifactId>
  27. <scope>test </scope>
  28. </dependency>
  29. <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
  30. <dependency>
  31. <groupId>org.springframework.boot </groupId>
  32. <artifactId>spring-boot-starter-data-redis </artifactId>
  33. <version>2.4.5 </version>
  34. </dependency>
  35. <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
  36. <dependency>
  37. <groupId>org.apache.commons </groupId>
  38. <artifactId>commons-pool2 </artifactId>
  39. <version>2.9.0 </version>
  40. </dependency>
  41. </dependencies>
  42. <build>
  43. <plugins>
  44. <plugin>
  45. <groupId>org.springframework.boot </groupId>
  46. <artifactId>spring-boot-maven-plugin </artifactId>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. </project>

2、配置类

(1)application.properties


  
  1. # Redis数据库索引(默认为0)
  2. spring.redis.database=0
  3. # Redis服务器地址
  4. spring.redis.host=192.168.194.131
  5. # Redis服务器连接端口
  6. spring.redis.port=6379
  7. # Redis服务器连接密码(默认为空)
  8. spring.redis.password=
  9. # 连接池最大连接数(使用负值表示没有限制)
  10. spring.redis.jedis.pool.max-active=20
  11. # 连接池最大阻塞等待时间(使用负值表示没有限制)
  12. spring.redis.jedis.pool.max-wait=-1
  13. # 连接池中的最大空闲连接
  14. spring.redis.jedis.pool.max-idle=10
  15. # 连接池中的最小空闲连接
  16. spring.redis.jedis.pool.min-idle=0
  17. # 连接超时时间(毫秒)
  18. spring.redis.timeout=1000

(2)RedisConfig


  
  1. package com.guor.redisspringboot.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.JsonTypeInfo;
  4. import com.fasterxml.jackson.annotation.PropertyAccessor;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
  7. import org.springframework.cache.annotation.EnableCaching;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  11. import org.springframework.data.redis.cache.RedisCacheManager;
  12. import org.springframework.data.redis.cache.RedisCacheWriter;
  13. import org.springframework.data.redis.connection.RedisConnectionFactory;
  14. import org.springframework.data.redis.core.RedisTemplate;
  15. import org.springframework.data.redis.serializer.*;
  16. import java.time.Duration;
  17. @EnableCaching
  18. @Configuration
  19. public class RedisConfig {
  20. @Bean
  21. public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
  22. RedisTemplate<String, Object> template = new RedisTemplate<>();
  23. template.setConnectionFactory(factory);
  24. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  25. ObjectMapper om = new ObjectMapper();
  26. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  27. // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  28. om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
  29. jackson2JsonRedisSerializer.setObjectMapper(om);
  30. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  31. // key采用String的序列化方式
  32. template.setKeySerializer(stringRedisSerializer);
  33. // hash的key也采用String的序列化方式
  34. template.setHashKeySerializer(stringRedisSerializer);
  35. // value序列化方式采用jackson
  36. template.setValueSerializer(jackson2JsonRedisSerializer);
  37. // hash的value序列化方式采用jackson
  38. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  39. template.afterPropertiesSet();
  40. return template;
  41. }
  42. /**
  43. * 基于SpringBoot2 对 RedisCacheManager 的自定义配置
  44. * @param redisConnectionFactory
  45. * @return
  46. */
  47. @Bean
  48. public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  49. //初始化一个RedisCacheWriter
  50. RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
  51. //设置CacheManager的值序列化方式为json序列化
  52. RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
  53. RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer);
  54. RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
  55. //设置默认超过时期是1天
  56. defaultCacheConfig.entryTtl(Duration.ofDays( 1));
  57. //初始化RedisCacheManager
  58. return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
  59. }
  60. }

3、控制类测试


  
  1. package com.guor.redisspringboot.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. @RequestMapping("/redisTest")
  9. public class RedisTestController {
  10. @Autowired
  11. private RedisTemplate redisTemplate;
  12. @GetMapping
  13. public String getRedis(){
  14. redisTemplate.opsForValue().set( "name", "zs");
  15. String name = (String) redisTemplate.opsForValue().get( "name");
  16. return name;
  17. }
  18. }

4、测试

 

往期精彩内容:

Java知识体系总结(2021版)

Java多线程基础知识总结

【全栈最全Java框架总结】SSH、SSM、Springboot

超详细的springBoot学习笔记

常见数据结构与算法整理总结

Java设计模式:23种设计模式全面解析

Java面试题总结(附答案)


转载:https://blog.csdn.net/guorui_java/article/details/116331217
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场