阿里云建设网站,怎样建设商城网站,做网站 用asp,网站制作自己目录一#xff1a;背景介绍二#xff1a;redis1#xff09;redis数据类型①String#xff08;字符串#xff09;②Hash#xff08;哈希#xff09;③List#xff08;列表#xff09;④Set#xff08;集合#xff09;2)缓存同步①设置有效期②同步双写③异步通知3背景介绍二redis1redis数据类型①String字符串②Hash哈希③List列表④Set集合2)缓存同步①设置有效期②同步双写③异步通知3key的过期时间具体设置方式三问题分析过程四总结五升华一背景介绍
此案例是通过Reids查询该课程下所有的班级信息如果从reids中没有查询到数据那么就会从数据库中查询并把查询到的数据存入到redis中。 存在的问题没有再更新课程下的班级数据时删除缓存这样会导致如果更新了该课程下的班级数据那么缓存中的数据和数据中的数据出现不一致的情况。
二redis
1redis数据类型
redis支持五种数据类型string字符串、hash哈希、list列表、set集合
①String字符串
string是redis最基本的类型可以理解成与Memcached一模一样的类型一个key对应一个value。redis的string可以包含任何数据比如jpg图片或者序列化的对象。
redis 127.0.0.1:6379 SET runoob Hello
OK
redis 127.0.0.1:6379 GET runoob
Hello以上实例我们使用了Redis的SET和GET命令键为runoob对应的值为Hello
②Hash哈希
Redis hash是一个键值keyvalue对集合是一个string类型的field和value的映射表用于存储对象 DEL runoob用于删除前面测试用过的key不然会报错(error) WRONGTYPE Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379 DEL runoob
redis 127.0.0.1:6379 HMSET runoob field1 Hello field2 World
OK
redis 127.0.0.1:6379 HGET runoob field1
Hello
redis 127.0.0.1:6379 HGET runoob field2
World以上实例我们使用了Redis HMSETHGET命令HMSET设置了两个fieldvalue对HGET获取对应field对应的value。
③List列表
Redis列表是简单的字符串列表按照插入顺序排序
redis 127.0.0.1:6379 DEL runoob
redis 127.0.0.1:6379 lpush runoob redis
(integer) 1
redis 127.0.0.1:6379 lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379 lpush runoob rabbitmq
(integer) 3
redis 127.0.0.1:6379 lrange runoob 0 10
1) rabbitmq
2) mongodb
3) redis
redis 127.0.0.1:6379④Set集合
Redis的Set是string类型的无序集合集合是通过哈希表实现的 sadd命令 添加一个string元素到key对应的set集合中成功返回1如果元素已经在集合中返回0.
sadd key memberredis 127.0.0.1:6379 DEL runoob
redis 127.0.0.1:6379 sadd runoob redis
(integer) 1
redis 127.0.0.1:6379 sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379 sadd runoob rabbitmq
(integer) 1
redis 127.0.0.1:6379 sadd runoob rabbitmq
(integer) 0
redis 127.0.0.1:6379 smembers runoob1) redis
2) rabbitmq
3) mongodb以上实例中rebbitmq添加了两次但根据集合内元素的唯一性第二次插入的元素将被忽略
2)缓存同步
①设置有效期
给缓存设置有效期到期后自动删除。再次查询时更新。 优点 简单方便 缺点 时效性差缓存过期之前可能不一致 场景 更新频率较低时效性要求低的业务
②同步双写
在修改数据库的同时直接修改缓存 优点 时效性强缓存与数据库强一致 缺点 有代码侵入耦合度高 场景 对一致性时效性要求较高的缓存数据
③异步通知
修改数据库时发送事件通知相关服务监听到通知后修改缓存数据 优点 低耦合可以同时通知多个缓存服务 缺点 时效性一般可能存在中间不一致状态 场景 时效性一般有多个服务需要同步
3key的过期时间
Redis过期时间设置命令有两种 PEXPIRE以毫秒为单位设置key的生存时间 EXPIPE以秒为单位设置key的生存时间
具体设置方式
EXPIRE key seconds //将key的生存时间设置为ttl秒PEXPIRE key milliseconds //将key的生成时间设置为ttl毫秒EXPIREAT key timestamp //将key的过期时间设置为timestamp所代表的的秒数的时间戳PEXPIREAT key milliseconds-timestamp //将key的过期时间设置为timestamp所代表的的毫秒数的时间戳
三问题分析过程
Redis如果只是将数据存入缓存以提高效率并设置缓存时间带来的问题是如果数据发生变化之后就得等key失效之后查询数据才会得到正确的数据。
public ListTbContent getContentListByCid(long cid) {//查询缓存try {//如果缓存中有直接响应结果String json jedisClient.hget(CONTENT_LIST, cid );if (StringUtils.isNotBlank(json)) {//json转列表TbContent.class是list中每个元素的类型ListTbContent list JsonUtils.jsonToList(json, TbContent.class);return list;}} catch (Exception e) { e.printStackTrace();}//如果缓存没有就查询数据库TbContentExample example new TbContentExample();Criteria criteria example.createCriteria();//设置查询条件criteria.andCategoryIdEqualTo(cid);//执行查询ListTbContent list contentMapper.selectByExampleWithBLOBs(example);//把结果添加到缓存try {jedisClient.hset(CONTENT_LIST, cid , JsonUtils.objectToJson(list));jedisClient.expire(CONTENT_LIST, 3600);} catch (Exception e) {e.printStackTrace();}return list;} 应该采取的做法是在对数据进行添加、修改和删除操作时删除数据查询数据时发现缓存中已删除就从数据库中查询得到最新的数据将最新的数据重新插入到缓存保证缓存中数据的准确性。
public E3Result addContent(TbContent content) {content.setCreated(new Date());content.setUpdated(new Date()); contentMapper.insert(content);//缓存同步jedisClient.hdel(CONTENT_LIST, content.getCategoryId().toString());return E3Result.ok();}四总结
1、如果开发人员要开发已有的代码需要和写此代码的开发人员进行沟通避免出现问题。 2、对于redis如何在项目中应用要及时查阅做总结。建议至少看三遍redis官网并画思维导图。
五升华
不怕不知道就怕不知道。