首页 > 数据库 > > 【Redis】缓存的三大问题及其解决方案
public Student getStudentsByID(Long id) {// 从Redis中获取学生信息Student student = redisTemplate.opsForValue().get(String.valueOf(id));if (student != null) {return student;}// 从数据库查询学生信息,并存入Redisstudent = studentDao.selectByStudentId(id);if (student != null) {redisTemplate.opsForValue().set(String.valueOf(id), student, 60, TimeUnit.MINUTES);} else {// 即使不存在,也将其存入缓存中redisTemplate.opsForValue().set(String.valueOf(id), null, 60, TimeUnit.SECONDS);}return student;}
O(1)时间复杂度内返回结果,效率极高,但是受限于存储容量,如果可能需要去判断的值超过亿级别,那么HashMap所占的内存就很可观了。BloomFilter解决这个问题的方案很简单。首先用多个bit位去代替HashMap中的数组,这样的话储存空间就下来了,之后就是对 Key 进行多次哈希,将 Key 哈希后的值所对应的 bit 位置为1。
BloomFilter并不支持删除操作,只支持添加操作。这一点很容易理解,因为你如果要删除数据,就得将对应的bit位置为0,但是你这个Key对应的bit位可能其他的Key也对应着。public String get(key) {String value = redis.get(key);if (value == null) { // 代表缓存值过期// 设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load dbif (redis.setnx(key_mutex, 1, 3 * 60) == 1) { // 代表设置成功value = db.get(key);redis.set(key, value, expire_secs);redis.del(key_mutex);} else { // 这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可sleep(50);get(key); // 重试}} else {return value;}}
·END·
如果您喜欢本文,欢迎点击右上角,把文章分享到朋友圈~~
作者:周二鸭
来源:https://www.cnblogs.com/jojop/p/14106671.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31535056/viewspace-3138095/ ,如需转载,请注明出处,否则将追究法律责任。