没有合适的资源?快使用搜索试试~ 我知道了~
首页redis 数据类型详解 以及 redis适用场景场合
redis 数据类型详解 以及 redis适用场景场合
需积分: 50 1.3k 浏览量
更新于2023-05-28
评论
收藏 135KB DOCX 举报
数据类型详解 以及 redis适用场景场合 数据类型详解 以及 redis适用场景场合
资源详情
资源评论
资源推荐

1. MySql+Memcached 架构的问题
Memcached 采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标
准,只要满足协议格式要求,客户端 Library 可以用任何语言实现。
Memcached 服务器使用基于 Slab 的内存管理方式,有利于减少内存碎片和频繁分
配销毁内存所带来的开销。各个 Slab 按需动态分配一个 page 的内存(和 4Kpage 的
概念不同,这里默认 page 为 1M),page 内部按照不同 slab class 的尺寸再划分为
内存 chunk 供服务器存储 KV 键值对使用(slab 机制相当于内存池机制, 实现从操作系
统分配一大块内存, 然后 memcached 自己管理这块内存, 负责分配与回收。)
关于 memcached 的内存分配机制:Memcached 内存分配机制介绍
实际 MySQL 是适合进行海量数据存储的,通过 Memcached 将热点数据加载到
cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,
和访问量的持续增长,我们遇到了很多问题:
1.MySQL 需要不断进行拆库拆表,Memcached 也需不断跟着扩容,扩容和维护工作
占据大量开发时间。
2.Memcached 与 MySQL 数据库数据一致性问题。
3.Memcached 数据命中率低或 down 机,大量访问直接穿透到 DB,MySQL 无法支撑。
4.跨机房 cache 同步问题。
关于 memcached 问题:Memcache 存储大数据的问题
众多 NoSQL 百花齐放,如何选择
最近几年,业界不断涌现出很多各种各样的 NoSQL 产品,那么如何才能正确地使用
好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最
重要的是了解这些产品的定位,并且了解到每款产品的 tradeoffs,在实际应用中做到扬长
避短,总体上这些 NoSQL 主要用于解决以下几种问题
1.少量数据存储,高速读写访问。此类产品通过数据全部 in-momery 的方式来保证高
速访问,同时提供数据落地的功能,实际这正是 Redis 最主要的适用场景。
2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。
3.这方面最具代表性的是 dynamo 和 bigtable 2 篇论文所阐述的思路。前者是一个完全
无中心的设计,节点之间通过 gossip 方式传递集群信息,数据保证最终一致性,后者是一
个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和
redo log,然后定期 compat 归并到磁盘上,将随机写优化为顺序写,提高写入性能。
4.Schema free,auto-sharding 等。比如目前常见的一些文档数据库都是支持
schema-free 的,直接存储 json 格式数据,并且支持 auto-sharding 等功能,比如
mongodb。
面对这些不同类型的 NoSQL 产品,我们需要根据我们的业务场景选择最合适的产品。
Redis 最适合所有数据 in-momory 的场景,虽然 Redis 也提供持久化功能,但实际更
多的是一个 disk-backed 的功能,跟传统意义上的持久化有比较大的差别,那么可能大家
就会有疑问,似乎 Redis 更像一个加强版的 Memcached,那么何时使用 Memcached,何时
使用 Redis 呢?
memcache 和 redis 的比较:

性能方面:没有必要过多的关心性能,因为二者的性能都已经足够高了。由于 Redis 只使用单核,而
Memcached 可以使用多核,所以在比较上,平均每一个核上 Redis 在存储小数据时比 Memcached 性能
更高。而在 100k 以上的数据中,Memcached 性能要高于 Redis ,虽然 Redis 最近也在存储大数据的性
能上进行优化,但是比起 Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,
每秒处理请求的次数都不会成为瓶颈。(比如瓶颈可能会在网卡)
内存使用效率:使用简单的 key-value 存储的话,Memcached 的内存利用率更高,而如果 Redis 采用
hash 结构来做 key-value 存储,由于其组合式的压缩,其内存利用率会高于 Memcached。当然,这和
你的应用场景和数据特性有关。
数据持久化:如果你对数据持久化和数据同步有所要求,那么推荐你选择 Redis,因为这两个特性
Memcached 都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择 Redis 也是明
智的。
数据结构:当然,最后还得说到你的具体应用需求。Redis 相比 Memcached 来说,拥有更多的数据结
构和并支持更丰富的数据操作,通常在 Memcached 里,你需要将数据拿到客户端来进行类似的修改
再 set 回去。这大大增加了网络 IO 的次数和数据体积。在 Redis 中,这些复杂的操作通常和一般的
GET/SET 一样高效。所以,如果你需要缓存能够支持更复杂的结构和操作,那么 Redis 会是不错的选
择。
网络 IO 模型方面:Memcached 是多线程,分为监听线程、worker 线程,引入锁,带来了性能损耗。
Redis 使用单线程的 IO 复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
内存管理方面:Memcached 使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然
有很大空间时,新的数据也可能会被剔除,而 Redis 使用现场申请内存的方式来存储数据,不会剔除
任何非临时数据 Redis 更适合作为存储而不是 cache
数据的一致性方面:Memcached 提供了 cas 命令来保证.而 Redis 提供了事务的功能,可以保证一串 命
令的原子性,中间不会被任何操作打断
如果简单地比较 Redis 与 Memcached 的区别,大多数都会得到以下观点:
1 、Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供
list,set,zset,hash 等数据结构的存储。
2 、Redis 支持数据的备份,即 master-slave 模式的数据备份。
3 、Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时
候可以再次加载进行使用。
4、Redis 可以实现主从复制,实现故障恢复。
5、Redis 的 Sharding 技术: 很容易将数据分布到多个 Redis 实例中
2. Redis 常用数据类型
Redis 最为常用的数据类型主要有以下:
String

Hash
List
Set
Sorted set
pub/sub
Transactions
在具体描述这几种数据类型之前,我们先通过一张图了解下 Redis 内部内存管理
中是如何描述这些不同数据类型的:
首先 Redis 内部使用一个 redisObject 对象来表示所有的 key 和
value,redisObject 最主要的信息如上图所示:
type 代表一个 value 对象具体是何种数据类型,
encoding 是不同数据类型在 redis 内部的存储方式,
比如:type=string 代表 value 存储的是一个普通字符串,那么对应的
encoding 可以是 raw 或者是 int,如果是 int 则代表实际 redis 内部是按数值型类
存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比
如:"123" "456"这样的字符串。
这里需要特殊说明一下 vm 字段,只有打开了 Redis 的虚拟内存功能,此字
段才会真正的分配内存,该功能默认是关闭状态的,该功能会在后面具体描述。通
过上图我们可以发现 Redis 使用 redisObject 来表示所有的 key/value 数据是比
较浪费内存的,当然这些内存管理成本的付出主要也是为了给 Redis 不同数据类
型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使
用,我们随后会具体讨论。

3. 各种数据类型应用和实现方式
下面我们先来逐一的分析下这 7 种数据类型的使用和内部实现方式:
String:
Strings 数据结构是简单的 key-value 类型,value 其实不仅是 String,也可以是数字.
常用命令: set,get,decr,incr,mget 等。
应用场景:String 是最常用的一种数据类型,普通的 key/ value 存储都可以归为
此类.即可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化,操
作日志及 Replication 等功能。除了提供与 Memcached 一样的 get、set、incr、decr 等操作外,
Redis 还提供了下面一些操作:
o
o 获取字符串长度
o 往字符串 append 内容
o 设置和获取字符串的某一段内容
o 设置及获取字符串的某一位(bit)
o 批量设置一系列字符串的内容
实现方式:String 在 redis 内部存储默认就是一个字符串,被 redisObject 所引
用,当遇到 incr,decr 等操作时会转成数值型进行计算,此时 redisObject 的
encoding 字段为 int。
Hash
常用命令:hget,hset,hgetall 等。
应用场景:在 Memcached 中,我们经常将一些结构化的信息打包成 HashMap,在客户端序列化后
存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常
需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于
一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在
数据库中 Update 一个属性一样只修改某一项属性值。
我们简单举个实例来描述下 Hash 的应用场景,比如我们要存储一个用户信
息对象数据,包含以下信息:
用户 ID 为查找的 key,存储的 value 用户对象包含姓名,年龄,生日等信息,如
果用普通的 key/value 结构来存储,主要有以下 2 种存储方式:
剩余19页未读,继续阅读



















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0