Skip to content

Instantly share code, notes, and snippets.

@wutingjia
Created March 16, 2019 06:04
Show Gist options
  • Save wutingjia/4e276c92fdfdbb00a5e1e5b26f0a4392 to your computer and use it in GitHub Desktop.
Save wutingjia/4e276c92fdfdbb00a5e1e5b26f0a4392 to your computer and use it in GitHub Desktop.
redis

redis是key-value,其中的value可能是map,这个map中键为了避免歧义被称为field
需要强一致性的数据不应该使用缓存。

redis为什么快

  • 它是基于内存的操作,CPU不是redis的瓶颈,可以轻松处理每秒几十万的请求。
  • redis是单线程省去了很多上下文线程切换的时间。 从而不需要各种锁的性能消耗。增加性能可以使用单线程多进程的集群方案。
  • 全程使用Hash结构,对一些数据储存进行了优化比如压缩表和跳表。
  • redis使用多路复用技术。非阻塞IO内部采用epoll。

redis的过期策略

定期删除+惰性删除:
redis默认每过100ms进行随机抽取检查。 当读写一个已经过期的key时,触发惰性删除。
redis.conf的 maxmemory-policy 配置项。

缓存穿透

即故意请求大量缓存中没有的key,会全部去请求数据库。

  • 互斥锁:对数据库请求的互斥锁。
  • 异步更新策略:无论是否取到值都返回,value维护一个缓存失效时间,过期后异步线程更新缓存。
  • 拦截机制:例如布隆过滤器,维护一系列合法key,遇到非法直接返回。

缓存雪崩

即缓存同一时间大面积失效,后续大量连接直接请求数据库。

  • 缓存失效时间加随机值。
  • 互斥锁
  • 双缓存

并发竞争key问题

即同时多个子系统set同一个key。

  • 数据如果不分片,可以使用redis本身的事务机制。
  • 数据如果分片,使用分布式锁,有顺序要求则可以再加上时间戳。

常用指令

查看所有或指定形式的key:KEYS */pattern

value是简单的String

创建:SET key value
获取指定key的值:GET key

value是List

创建或加入:RPUSH key value
获取指定key中的元素:LRANGE key 0 10
获取列表长度:LLEN key
通过索引获取指定key中的元素:LINDEX key index
移除并获取指定key的元素:LPOP key

value是Hash

创建或插入:HSET key field value
获取指定key中所有field:HKEYS key
获取指定key中所有value:HVALS key
获取指定key中指定field的值:HGET key field
删除指定key中的指定field:HDEL key field

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment