Redis
Redis是数据库
是nosql数据库
key-value形式存储数据
内存中存储
角色:==数据库,缓存==,消息中间件
基本数据类型:String、list、set、zset、hash
支持持久化:能保存数据到磁盘中
安装Redis
在redis目录下执行
redis-server.exe --service-install redis.windows.conf
常用指令
String
Set key value [10]
存储基本的字符串,数字 set age 10
获取数据 get age
数字类型 自增 incr age (i++)
incrby age 10 (i+10)
自减 decr age (i--)
decrby age 10 (i-10)
设置带过期时间的key setex name 100 小明 setex key 秒 值
List
lpush v1,v2... 是在list的前面(头部,左边)增加值
rpush 尾部,右边增加值
lpop booklist 删除 (左边,头部)第一个元素
llen booklist list长度
lindex booklist 2 查询索引下的值
lset booklist 2 遮天 替换某个位置的值
lrange booklist 0 2 分页
Hash(map)
key feild value
hset key feild value 单条添加
hmset key field1 value1 field2 value2 多条批量添加
hgetall bookmap 查询所有的
hget bookmap 1001 单条
hmget bookmap 1002 1004 1001 批量查询
hkeys bookmap 所有的key
hvals bookmap 所有的值
hdel bookmap 1001 删除某个feild值
Set
无序集合,成员唯一(不可重复)
sadd book1 添加数据
smembers book1 查询 key下的所有数据
sdiff book1 book2 查询的是第一个key中存在,第二个key中不存在的值
sdiffstore book3 book1 book2 查询book1中存在的值book2中不存在的值存入book3
sinter book1 book2 交集
sinterstore book4 book1 book2 查询book1和book2的交集并且存入book4
sunion book1 book2 并集
sunionstore book5 book1 book2 查询book1和book2的并集,存入book5
ZSet
key score value
key 分数 值
zadd giftrank 100 小明 添加数据
zincrby giftrank 900 小明 key增加数据,如果之前没有值,添加,如果有值,score +900
zrank giftrank 小明 正序,获取小明的排名
zrevrank giftrank 小明 逆序,获取小明的排名
zrange giftrank 0 2 正序查询前三名
zrevrange giftrank 0 2 逆序查询前三名
zscore giftrank 小明 查询分数
其他指令
del book1 删除某个key
exists book2 判断key是否存在
expire book2 10 设置过期时间
SpringBoot整合Redis
整合
引入依赖
<!--redis:RedisAutoConfiguration-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
redis:
password: javasm
host: 127.0.0.1
port: 6379
缓存
@Override
public PnGoods getByIdFromRedis(Integer id) {
//通过id 去redis查询数据,如果查到了,返回数据,如果查询不到,去数据库查询,然后把数据存入redis,再返回数据
//通过key 从Redis中 获取数据
String key = "goods:id:"+id;
Object o = redisTemplate.opsForValue().get(key);
if (o == null){
//Redis中没有数据
PnGoods goods = getById(id);
if (goods!=null){
redisTemplate.opsForValue().set(key,goods);
}
return goods;
}
//查询到了数据
return (PnGoods) o;
}
配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
@Override
public PnGoods getByIdFromRedis(Integer id) {
//通过id 去redis查询数据,如果查到了,返回数据,如果查询不到,去数据库查询,然后把数据存入redis,再返回数据
//通过key 从Redis中 获取数据
String key = "goods:id:"+id;
Object o = redisTemplate.opsForValue().get(key);
if (o !=null){
//查询到了数据
return (PnGoods) o;
}
//Redis中没有数据
PnGoods goods = getById(id);
if (goods!=null){
redisTemplate.opsForValue().set(key,goods);
return goods;
}
//查询不到数据的时候,防止缓存穿透
redisTemplate.opsForValue().set(key,new PnGoods(),30, TimeUnit.SECONDS);
return null;
}
缓存注解
1.启用redis注解识别
@EnableCaching //缓存注解识别
2.在service层的查询方法使用@Cacheable注解,表示执行方法前先查询缓存,缓存中没有再执行方法,并把方法返回值添加缓存。
3.在service层的更新与删除方法使用@CacheEvict注解,表示清除缓存中指定的key。
//执行方法时,先去缓存roles:1,缓存没有数据执行方法,把方法返回结果加入缓存
//@Cacheable(cacheNames = "userinfo",key="#id")
// UserModel getById(Integer uid);
@Cacheable(cacheNames = "roles",key = "#id")
public Role getById(String id) {
return super.getById(id);
}
//执行update方法时。先执行方法,方法完成后删除缓存
@CacheEvict(cacheNames = "roles",key="#obj.id")
public boolean update(Role obj) {
return super.update(obj);
}