缓存穿透高并发下查询一个值,缓存中没有,数据库中也没有,布隆过滤器
解决方案:
- 如果数据库中值为空,把空写入缓存即可 。
- 也可以把所有的可能存在的key放入到一个大的Bitmap中,查询时通过该Bitmap过滤
解决方案:
尽量不要把所有缓存都设置在同一时间过期, 通过加锁或者队列只允许一个线程查询数据库和写缓存, 其他线程等待.
通过加锁或者队列只允许一个线程查询数据库和写缓存,其他线程等待 。
热点缓存(缓存击穿)双重检测锁解决热点缓存问题,需要加volatile防止指令重排
高并发下,一个热点缓存到期,然后去数据库中去取,当还没有放入缓存中时,大量请求过来
解决方案:
- 双重检测锁
Integer count = redis.get("key");if (count == null) { synchronized { count = redis.get("key"); if (count == null) { count = repo.getCount(); redis.put("key", count); }}} - 也可以用redis的setnx互斥锁进行判断
if (redis.setnx(lockKey, requestId, NX, PX) == 1) {} 缓存双写一致性解决方案:
延时双删策略, 先更新数据库,再删缓存
public void write(String key,Object data){ redis.delKey(key); db.updateData(data); // 可以将以下两步作为异步处理 Thread.sleep(1000); redis.delKey(key);}Redis简介Redis是一种用C语言开发的,高性能的,键值对key-value形式的noSql数据库支持5种string, hash, set, list, 有序集合类型(sorted set, 简称zset)等数据类型
劣势就是存储的数据缺少结构化
应用场景:
- 内存数据库(登录信息,购物车信息,用户浏览记录)
- 缓存信息
- 解决分布式架构中的session分离问题
- redis-server
- redis-client
- 性能测试工具redis-benchmarkredis-benchmark -q(Quiet. Just show query/sec values) -n(default 100000 requests)-h <hostname> Server hostname (default 127.0.0.1) -p <port> Server port (default 6379) -s <socket> Server socket (overrides host and port) -a <password> Password for Redis Auth -c <clients> Number of parallel connections (default 50) -n <requests> Total number of requests (default 100000) -d <size> Data size of SET/GET value in bytes (default 2) -dbnum <db> SELECT the specified db number (default 0) -k <boolean> 1=keep alive 0=reconnect (default 1) -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD Using this option the benchmark will expand the string rand_int inside an argument with a 12 digits number in the specified range from 0 to keyspacelen-1. The substitution changes every time a command is executed. Default tests use this to hit random keys in the specified range. -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline). -q Quiet. Just show query/sec values --csv Output in CSV format -l Loop. Run the tests forever -t <tests> Only run the comma separated list of tests. The test names are the same as the ones produced as output. -I Idle mode. Just open N idle connections and wait.
- redis-check-aofaof文件检查的工具
- redis-check-dumprdb文件进行检查的工具
- redis-sentinel启动哨兵监控服务
- string set key value, get key, getset key value, incr key(必须为整数), incrby key increment, decr key, decrby incrementsetnx key value, Append key value, strlen key, mset key1 value2 key2 value2..., mget key1, key2 ...
- hash散列类型,如(people --> name --> "chris")字段的名只能用stringhset key field value, hget key field, hmset ..., hsetnx key field value(同hset,但是如果field存在,则不执行任何操作),hmget 批量取, hdel key, hincrby key field increment, hexists key field, hkeys key, hvals key, hlen key, hgetall key
- list类型(链表实现的)lpush/rpush, lrange, lpop/rpop, llen, lrem key count value当count>0时,从左边开始删,删除在count范围内,值为value的元素当count<0时,从右边开始删当count=0时,删除所有值为value的元素lindex, lset key index value, ltrip key start stop, linsert key before|after "specified value" value, rpoplpush,
- set类型 不重复且没有顺序(指放入和取出的顺序不一致)sadd,srem key value, smembers key, sismember key value, sdiff A B(A - B), sinter A B(A ∩ B), sunion A B(A ∪ B),scard key(获取元素个数),spop(从集合中随机选择一个元素弹出)
推荐阅读
- 什么是工艺花茶,调味茶是什么
- 企业VPN数据传输流量走向解密
- 玫瑰茶的功效与禁忌,玫瑰花茶泡水喝的功效
- 昆仑雪菊的冲泡方法,冲泡小诀窍
- 新疆野生胎菊的功效,由内而外的美
- 丰胸花茶有哪些,茉莉花茶的产地有哪些
- 白梅花的功效与作用,苹果花的功效与作用
- 枸杞茉莉花茶的功效,喝茉莉花茶的好处和功效作用
- 玫瑰花茶搭配大全,玫瑰花茶怎么泡
- 明目花茶搭配大全,巧喝花茶
