springboot系列之redis
简介
- redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化
- 可以支持每秒十几万此的读/写操作
- Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。
- redis持久有两种方式:快照(快照,默认dump.rdb中),仅附加文件(AOF)
快照(快照)
1,将存储在内存的数据以快照的方式写入二进制文件中,如默认dump.rdb中
2,保存900 1
#900秒内如果超过1个Key被修改,则启动快照保存
3,保存300 10
#300秒内如果超过10个Key被修改,则启动快照保存
4,保存60 10000
#60秒内如果超过10000个重点被修改,则启动快照保存
仅附加文件(AOF)
1,使用AOF持久时,服务会将每个收到的写命令通过写函数追加到文件中(appendonly.aof)
2,AOF持久化存储方式参数说明
appendonly yes
#开启AOF持久化存储方式
appendfsync always
#收到写命令后就立即写入磁盘,效率最差,效果最好
appendfsync everysec
#每秒写入磁盘一次,效率与效果居中
appendfsync no
#完全依赖操作系统,效率最佳,效果没法保证
- 清除所有缓存 flushall
- Script Flush 命令用于清除所有 Lua 脚本缓存
- 配置文件设置daemonize为yes,将以后台形式启动redis
springboot中使用redis
- springboot系列之redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
- 添加配置文件:
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=50
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=30
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=10
redisUtils编写(重点),注意存储对象必须实现Serializable接口
/**
* @auther 高松
* @DATE 2019/7/20 14:02
* spring-redis
*/
@Component
public class RedisUtils {
//springboot自动注入
@Resource
private RedisTemplate<Object,Object> redisTemplate;
/**
* 默认redis使用jdkSerializationRedisSerializer,这样存入redis时进行序列化变为二进制这样不方便查看看
* 需要自行设置为字符串序列化方便查看存入的值
* 值得注意的是当我们进行模糊查询时,由于没有设置字符串序列化会影响我们模糊查询的结果
* 当然如果要存入对象我们需要让pojo实现Serializable接口
*/
@PostConstruct
public void Init(){
RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.afterPropertiesSet();
}
/**
* 常用操作对象
* 1.字符串操作
* 2.散列集合操作(hash)
*/
public void stringOps(){
//1.字符串操作
User user = new User();
user.setSex("jj");
user.setName("gs");
redisTemplate.opsForValue().set("gsong",user);
System.out.println(redisTemplate.opsForValue().get("gsong"));
}
public void hashOps(){
//2.hash操作
User user = new User();
user.setSex("jj");
user.setName("gs");
redisTemplate.opsForHash().put("gsongHash","myself",user);
redisTemplate.opsForHash().get("gsongHash","name");
Map<Object, Object> gsongHash = redisTemplate.opsForHash().entries("gsongHash");
gsongHash.entrySet().iterator().forEachRemaining(a -> System.out.println(a.getKey()+":"+a.getValue()));
//设置过期
redisTemplate.expire("gsongHash",10, TimeUnit.SECONDS);
}
/**
* 那么在同一个连接中多个redis命令该怎么办呢,实现
*/
public void opsManyTimes(){
User user = new User();
user.setSex("jj");
user.setName("gs");
redisTemplate.execute(
new SessionCallback() {
@Override
public Object execute(RedisOperations redisOperations) throws DataAccessException {
redisOperations.opsForValue().set("gsong3",user);
redisOperations.opsForHash().put("gsong3Hash","USER",user);
return null;
}
});
}
/**
* 当然我们怎么操作lua脚本呢?,lua脚本能保证我们操作的原子性
* 值得注意的是springboot默认使用的是lettuce操作Redis应为它的异步和集群支持
*/
public void opScript(){
//获取底层连接对象类似(jedis)
RedisScriptingCommands redisScriptingCommands = redisTemplate.getConnectionFactory().getConnection().scriptingCommands();
//返回一个乱脚本标识码
String sha1 = redisScriptingCommands.scriptLoad("return redis.call('SET',KEYS[1],ARGV[1])".getBytes());
System.out.println("lua脚本标识码"+sha1);
//执行lua脚本
Object o = redisScriptingCommands.evalSha(sha1, ReturnType.STATUS, 1, "GSONGLUA".getBytes(), "GSONGLUA".getBytes());
System.out.println("执行结果!"+o.toString());
}
/**
*模糊匹配,?(单个字符),*(多个字符)
* */
public void likeOps(){
Iterator<Object> iterator = redisTemplate.keys("gsong*").iterator();
StringBuilder stringBuilder = new StringBuilder(".");
iterator.forEachRemaining(a-> stringBuilder.append(a));
System.out.println(stringBuilder.toString());
}
}
源码地址:链接:https://pan.baidu.com/s/12mMcTQOoRfXR4JhErp9Ktg
提取码:9vvv