缓存数据库

缓存的类型

缓存是使用内存保存数据。

  • 本地缓存:本地缓存是进程内存中的缓存,可以用LRU Map、Ehcache实现,单机容量较小,不能扩展。
  • 分布式缓存:用来应付较大数据量,水平扩展方便。需要远程请求,性能相对低。
  • 多级缓存:实际业务中采用多级缓存。本地缓存保存访问频率高的热点数据,其它热点数据放于分布式缓存。

淘汰策略

对超过内存容量的缓存数据踢除。

  • FIFO:淘汰最早
  • LRU:淘汰最近最少使用
  • LFU:淘汰最近最低频使用

Memcached

Memcached,可以简称为MC,是高性能分布式内存缓存服务器。

  • 多线程异步IO模式处理请求
  • 简单key-value结构,key不超过250B,value不超过1MB
  • 可以设计数据失效期,延迟失效策略,即再次使用数据时检查。key最长失效周期是30天
  • 只支持内存,不支持持久化。
  • 不支持主从同步

通过 Slab机制管理内存,主要解决了频繁malloc、free产生碎片的问题。MC的问题有钙化问题,预热以防止雪崩问题等。

Redis

Redis:Remote Dictionary Server 远端字典服务,可用作高速缓存、key-value数据库和消息队列代理

  • 单线程模式处理请求,非阻塞异步事件处理机制,缓存数据都是内存操作,IO时间不会太长,单线程可以避免上下文切换开销。
  • 支持持久化,所以也可以用作NoSQL数据库。提供两种持久化策略:RDB快照和AOF日志。
  • 支持多种数据类型,String/List/Hash/Set/Sorted Set
  • 提供主从同步(master-slave)机制、cluster集群部署能力,能提供高可用服务。

Redis的功能

  • bitmap
  • hyperLogLog
  • geospatial
  • pub/sub
  • pipeline
  • lua脚本
  • 非完全事务

Redis单个value的最大限制是1GB,可以用来实现很多功能,例如用它的List来做FIFO双向链表实现一个轻量级的高性能消息队列服务,用它的Set可以做高性能的tag系统等。
Redis把整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
Redis可以对存入的Key-Value设置expire时间。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要在较小数据量的高性能操作和运算上。
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。
Redis支持主从的模式。原则上Master会将数据单向同步到Slave,Slave启动时会连接Master来同步数据,这是一个典型的分布式读写分离模型。我们可以利用Master来插入数据,Slave提供检索服务,这样可以有效减少单个机器的并发访问数据。通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。而读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,这样在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,对于写密集(Write-intensive)类型的应用,读写分离架构并不适合。

缓存常见问题

  • 缓存更新
  • 缓存不一致
  • 缓存穿透:典型场景是恶意请求实际不存在的数据,缓存中不存在,继而访问数据库。解决方式有缓存空对象、bloomfilter过滤器检测数据存在性。
  • 缓存击穿:主要场景是热点key失效,此时伴随大量请求。解决方式有互斥更新、随机退避、差异失效时间。
  • 缓存雪崩:典型原因是缓存crash。解决方式有:快速失败熔断、主从模式、集群模式。

Redis中存储对象

根据数据量级别,如果是存储百万级的大数据对象,建议采用存储序列化对象方式。如果是少量的数据级对象,或者是数据对象字段不多,建议采用JSON转换成String方式。毕竟redis对存储字符类型优化的非常好。

Redis命令

docker exec -it 容器ID /bin/sh
redis-cli
AUTH 密码
HGETAll EQP:INFO:EQPID_4886
HGET EQP:INFO:EQPID_4886 "\xac\xed\x00\x05t\x00\bphoneDad"
HSET EQP:INFO:EQPID_4886 "\xac\xed\x00\x05t\x00\bphoneDad" "\xac\xed\x00\x05t\x00\x0b16695010385-1234"

redis 配置文件 https://blog.csdn.net/zhywbp/article/details/76528500

发表评论