mysql和redis共存,并不是redis取代mysql,而是对mysql的一个补充
**热点数据**一般用于访问量过大的时候,提高我们的读写性能
抢购、秒杀、资讯、新闻、热点商品
这个conf是修改配置端口号的,平时不用动
默认是没密码的,为了安全可以修改conf
requirepass 123456即可设置密码
启动客户端
redis-cli.exe -h localhost -p 6379 -a 123456 //这样就输入密码了,redis不用输入用户名
exit命令退出客户端
**启动方式**
redis-server.exe redis.windows.conf
**结束**
结束也很简单,直接ctrl+c就ok了
1、导入依赖Maven坐标
spring-boot-starter-data-redis
2、配置数据源
spring:
redis:
host: localhost
port:6379
password:123456
database:10 #第几个数据库、默认是0
3、创建redis配置类
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("创建redis模板对象");
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
//这里要序列化,否则redis客户端会出现乱码
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
**关于四大类型**
ValueOperations valueOperations = new redisTemplate.opsForValue();
Hash\List\Set\Zset
获取逻辑层Redis的Bean
@Autowired
private RedisConfiguration redisConfiguration;
**一、字符串类型**
```
//字符串对应的方法如下
//方法为:set、get、setex、setnx这里setex也还是set,setnx对应的是setIfAbsent
//setex表示set设定一个有效期
//这里setnx一般作为创建的方法,而不能用做修改、
//也就是这个key不存在的时候可以set可以setnx
//故set键值对,这个键不存在,方法set成功,若不存在则set失败
redisTemplate.opsForValue().set("city","北京");
String city = (String)redisTemplate.opsForValue().get("city");
redisTemplate.opsForValue().set("code","1234","3",TimeUnit.MINUTES);
```
**二、哈希类型**
```
H哈希对应的方法为hset、hget、hdel、hkeys、hvals
HashOperations hashOperations = new redisTemplate.opsForHash();
hashOperations.put("100","name","tom");
hashOperations.put("100","age","20");
hashOperations.get("100","name");
//会返回一个set集合,获得所有的key
Set keys = hashOperations.keys("100");
//获取所有的value
List values = hashOperations.values("100");
hashOperations.delete("100","name");
这里的key有两个概念,一个是redis的key,一个是哈希表的key、如果没有设置密码,就把配置文件中的密码注释掉
```
**三、List方法**
```
List方法包括lpush、lrange、rpop、llen
同样List中有key、
ListOperations listOperations = new redisTemplate.opsForList();
listOperations.leftPushAll("mylist","a","b","c");
//插入后的顺序为倒序
listOperations.leftPush("mylist","d");
List mylist = listOperations.range("mylist","0","-1");
//从右侧移除元素
listOperations.rightPop("mylist");
Long size = listOperation.size("mylist");
```
**四、Set集合类的方法**
```
sadd、smembers、scard、sinter、sunion、srem分别对应为
add(“set1”,"a","b","c")//添加元素
members("set1")//展示所有元素,返回一个Set集合、
size返回Long也就是集合的个数
intersect获得两个集合交集
union获得集合并集
remove删除集合中的元素
```
**五、Zset有序集合类的方法**顺序好像是由大到小的
```
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//zadd zrange zincrby zrem
zSetOperations.add("zset1","a",10);
zSetOperations.add("zset1","b",11);
zSetOperations.add("zet1","c",9);
Set zset1 = zSetOperations.range("zset1", 0, -1);
System.out.println(zset1);
//zincrby 为某个集合的元素加上多少分score
zSetOperations.incrementScore("zset1","c",10);
//zrem
zSetOperations.remove("zset1","a","b");
```
**六、通用命令操作**
```
//这里就不像上面似的还要opsFor类型了
//因为是通用命令,所以不用指定类型
//keys exits type del
Set keys = redisTemplate.keys("*");
System.out.println(keys);
//exits检查某个key是否存在
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
//type查询一下某个key所对应的value什么类型的
//这里key循环遍历所有的keys键
for (Object key : keys){
DataType type = redisTemplate.type(key);
System.out.println(type.name());
//这里返回具体他们都是什么类型的
}
//del 删除指定的key
redisTemplate.delete("mylist");
}
```
**关于缓存的操作**
这里缓存数据,list列表数据,例如菜品列表可以存入redis为字符串类型,标记字符串类型的key即可获取list
这里判空,若!=null && size()>0则redis查询到数据直接返回
1、直接查询redis
2、若不为空并且size>0
3、否则查询数据库,并存储进redis
**清理缓存**
1、修改数据库数据
2、删除数据库数据
3、启用或停用,都即时清缓存
4、新增
用名称+id的形式取名redis中的字符串值的key