今天我们来讲一讲缓存
目前,memcache 和 redis 是互联网分层架构中,最常用的 key/value 缓存。
那么如何选择呢 ?
下面来看一下两种缓存的比较
| redis | mecache |
吞吐量 | 十万左右 QPS | 达到几十万 QPS |
数据结构 | 支持多种数据结构,如哈希,列表,集合,有序集合这类复杂的数据结构 | 只支持简单的 key/value 数据结构 |
持久化 | 1.redis 的定期快照不能保证数据不丢失 2.redis 的 AOF 会降低效率,并且不能支持太大的数据量 | mecache 无法满足持久化的需求 |
高可用 | redis 天然支持集群功能,可以实现主动复制,读写分离 | memcache,要想要实现高可用,需要进行二次开发 |
能存储的内容大小 | 存储的内容比较大,最大为 1M | 较小 |
并发量 | 使用单核 | 可以使用多核 |
内存分配 | redis 是临时申请空间,可能导致碎片 | memcache 使用预分配内存池的方式管理内存,能够省去内存分配时间 |
网络模型 | 非阻塞 IO 复用模型,但由于redis还提供一些非KV存储之外的排序,聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个 IO 调度 | 非阻塞 IO 复用模型 |
底层模型 | 有自己的 VM 机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发 swap ,把冷数据刷到磁盘上,会浪费一定的时间去移动和请求 | memcache 把所有的数据存储在物理内存里 |
总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的 key/value 存储,选择 memcache
接下来,我会着重讲一下 redis
首先,我们来想一想,redis 为什么效率这么高?
简单概括一下,有下面几点
1)纯内存操作,内存响应时常大约 100 nm
2)核心是基于非阻塞的 IO 多路复用机制,加上reids自身的事件处理模型将 epoll 的连接,读写,关闭都转换为事件。不在网络 IO 上浪费时间。
3)单线程反而避免了多线程的频繁上下文切换问题
4)C 语言的执行速度更快
那他能用于哪些场景呢?
1.缓存,这是最常见的,对于经常需要读取的数据,可以添加缓存
2.排行榜系统, list 和 sortSet
3.计数器应用,播放量,浏览数等
4.社交网络,
5消息队列系统
6共享 session
7限制访问
。。。。。。
那我们该怎么使用它呢?
第一步:安装,参考网上教程 , 可在配置文件(redis.conf)中配置相应属性
第二步:启动并连接,进入安装的文件夹后,在命令栏输入 bin/redis-server 便可启动 redis 服务端,输入 bin/redis-cli 便可进入客户端,如果你连的是远程服务器,需要指定地址。bin/redis-cli -h host -p port -a password, 如:redis-cli -h 127.0.0.1 -p 6379 -a "mypass",-h, -p, -a, 分别是主机,端口,密码
那么现在就可以尽情使用 redis 了。
使用前我先来说一下,redis 它到底能存些什么东西
1.字符串
Redis 中的字符串是一个字节序列。Redis 中的字符串是二进制安全的,这意味着它们的长度不由任何特殊的终止字符决定。因此,可以在一个字符串中存储高达 512
兆字节的任何内容
示例命令
127.0.0.1:6379> set key "hello redis"
OK
127.0.0.1:6379> get key
"hello redis"
2. 哈希
Redis 散列/哈希 (Hashes) 是键值对的集合。Redis 散列/哈希是字符串字段和字符串值之间的映射。因此,它们用于表示对象。每个散列/哈希可以存储多达 2^32-1
个健-值对
示例命令
127.0.0.1:6379> HMSET key123 name "apple" color "red" distinct "zhejiang"
OK
127.0.0.1:6379> hmget key123 name
1) "apple"
3.列表
Redis 列表只是字符串列表,按插入顺序排序。您可以向 Redis 列表的头部或尾部添加元素。列表的最大长度为 2^32-1
个元素
示例命令
127.0.0.1:6379> lpush namelist "apple" "pear" "oringer"
(integer) 3
127.0.0.1:6379> lrange namelist 0 4
1) "oringer"
2) "pear"
3) "apple"
4 集合
Redis 集合是字符串的无序集合。在 Redis 中,您可以添加,删除和测试成员存在的时间 O(1) 复杂性
127.0.0.1:6379> sadd nameset "aa" "bb" "cc" "dd"
(integer) 4
127.0.0.1:6379> SMEMBERS nameset
1) "bb"
2) "dd"
3) "cc"
4) "aa"
5 排序集合
Redis 可排序集合类似于 Redis 集合,是不重复的字符集合。 不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。虽然成员是唯一的,但分数值可以重复
示例命令
127.0.0.1:6379> ZADD namezset 1 "aaa"
(integer) 1
127.0.0.1:6379> ZADD namezset 2 "bbb"
(integer) 1
127.0.0.1:6379> ZADD namezset 2 "bbb"
(integer) 0
127.0.0.1:6379> ZADD namezset 2 "bbcb"
(integer) 1
127.0.0.1:6379> ZADD namezset 3 "ccc"
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE namezset 1 3
1) "aaa"
2) "bbb"
3) "bbcb"
4) "ccc"
127.0.0.1:6379> ZRANGEBYSCORE namezset 1 2
1) "aaa"
2) "bbb"
3) "bbcb"
这次先到这里,相信大家对redis已经有一个初步的认识