上一篇中已经学习到我们的redis的安装,和基本的数据类型,接下来学习文件配置等一系列内容。学习视频资源地址
1、Redis6配置文件
(1)数据单位
- 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小些不敏感。
(2)配置远程访问
- 注掉bind
- 第二步是这里的:protected-mode 改为no
(3)tcp-backlog
(4)timeout
- 默认为0【你远程连接你的redis,很多时间没有操作,需要你重新连接才可以,如果设置为0就用不超时,如果设置为其他的,就多少时间后超时】
(4)tcp-keepalive
- 怎么说呢:我感觉就相当于每个300秒检测你的连接是否还活着【跟你心跳一样的】
(5)配置redis后台启动
- 之前讲过
(6)pidfile
- 你的进程号都是保存在run下面的一个文件里面
(7)日志级别
- 就是我们在开发的时候是debug呀什么的,可以更详细。
(8)database默认的数据库【为0号库】
(9)redis密码
- 打开注释的方式
- 通过命令的方式
- config get requirepass
- config set requirepass “密码”
- auth 你的密码
(10)limits
- 可以设置同时可以与多少个客户端进行连接,默认为10000个
- 如果达到上线,redis则会拒绝新的连接请求,并且向这些连接请求发出max number of clients reached
还有其他的就暂时不管了。以后用到了再记录。
2、redis发布和订阅
(1)概念
- 关系
- 多个频道
(2)发布和订阅的代码实现流程
- 订阅端的编写:SUBSCRIBE channell
- 发布端发布:publish channel message
- 结果
3、redis6的新数据类型
(1)新数据类型之Bitmaps
(2)Bitmaps常用命令
- 设置Bitmaps中某个偏移量(0或1):setbit key offset value
- 例子说明
效果展示
- 例子说明
- 取出值:getbit key offset
- 统计字符串被设置为1的bit数量,一般情况下,给定整个字符串都会被进行计数,通过指定额外的start和end参数,可以让计数只有特定的位上进行,start和end参数的设置,都可以使用负数值,比如-1表示最后一位,而-2表示倒数第二位,start和end是指bit组的字节下标数,二者揭包含。
- 统计字符串被设置为1的bit数量,一般情况下,给定整个字符串都会被进行计数,通过指定额外的start和end参数,可以让计数只有特定的位上进行,start和end参数的设置,都可以使用负数值,比如-1表示最后一位,而-2表示倒数第二位,start和end是指bit组的字节下标数,二者揭包含。
- 做一些符合操作:bitop
- Bitmaps和set的比较
(3)新数据类型之HyperLogLog
(4)HyperLogLog常用命令
- pfadd:添加数据
- pfcount:统计数量
- pfmerge:对内容进行合并
(5)新数据类型之Geospial
就是二维坐标。
(6)Geospial常用命令
-
geoadd key 经度 纬度 value
-
取出坐标值:geopos
-
获取两个位置之间的直线距离:geodist key 单位
-
以给定的经纬度为中心,找出某一半径内的元素:georadius key 经度 纬度 radius km/m/tf/mi
4、Jedis操作redis数据库
(1)测试连接
- 创建maven项目
- 要看着两个参数
- 测试连接【前提是你刚才已经进行了修改,对bind和那个保护模式为no,然后重启服务】
如果报如下错误【解决办法是:1、看配置文件里面的两是否修改,2、看你防火墙是否关闭,3、主要是你要把你的6379端口号放行】
- 获取测试
(2)模拟验证码的实现
-
生成随机的六位验证码
-
输入验证码,点击验证,返回登录成功或失败
package cn.mldn;
import redis.clients.jedis.Jedis;
import java.util.Random;
public class RedisCode {
public static void main(String[] args) {
System.out.println(getCode());
}
/**
* 1、生成验证码的方法
* @return
*/
public static String getCode() {
Random random = new Random();
String code = "";
for (int i = 0; i < 6; i++) {
int rand = random.nextInt(10);
code += rand;
}
return code;
}
/**
* 2、让每个手机只能发送三层,验证码放到redis里面,设置过期时间
*/
public static void verifyCode(String phone,String code) {
//连接redis
Jedis jedis = new Jedis("124.222.42.57",6379);
//拼接key
String countKey = "VerifyCode" + phone + ":count";
//验证码
String codeKey = "VerifyCode" + phone + ":code";
//每个手机每天只能发送三次
String count = jedis.get(countKey);
if (count == null) {
//如果为null,则没有发送过
jedis.setex(countKey,24*60*60,"1");
} else if (Integer.parseInt(count) <=2 ) {
//小于2的时候,就加一
jedis.incr(codeKey);
} else if (Integer.parseInt(count) > 2) {
//说明已经发送了三次了
System.out.println("你今天发送次数超过三次,不能再发送");
return;//阻止,不让他在发送
}
//发送的验证码发送到redis里面
String vcode = getCode();
jedis.setex(codeKey,120,vcode);
jedis.close();
}
/**
* 3、验证码的效验
*/
public static void getRedisCode(String phone,String code) {
//连接redis
Jedis jedis = new Jedis("124.222.42.57",6379);
//验证码
String codeKey = "VerifyCode" + phone + ":code";
String redisCode = jedis.get(codeKey);
if (redisCode.equals(code)) {
System.out.println("验证成功");
jedis.close();
} else {
System.out.println("验证失败");
jedis.close();
}
}
}
5、SpringBoot整合redis
(1)创建项目
- 废话不多说创建SpringBoot项目导入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
(2)properties文件
#redis服务器地址
spring.redis.host=124.222.42.57
#redis服务器的连接端口号
spring.redis.port=6379
#redis的数据索引(默认为0
spring.redis.database=0
#redis的超时时间(毫秒
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)编写配置类
@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)整合
@RestController
public class TestController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/redisTest")
public String testRedis() {
//设置值到redis里面
redisTemplate.opsForValue().set("name","key");
//从redis里面获取值
return (String)redisTemplate.opsForValue().get("name");
}
}