赞
踩
Redis是什么
Remote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis基本特点
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s (好用,不要迷信他它)
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问
Redis与memcache的不同
作为类Redis的memcache(key-value)产品,往往与redis做为比较,同时在对于后端面试过程中,许多面试考官所提频率比较高的问题,这里做下补充
Redis | memcache | |
数据存储方式 | 可以内存,可以持久化(硬盘中) | 内存中 |
存储数据类型 | 复杂数据类型(5大数据类型) | 简单字符串 |
灾难恢复 | 根据策略设置可以恢复 | 不可恢复 |
存储value值空间大小 | 最大1G byte | 最大1M |
多线程 | 单线程 | 多核操作 |
VM | 当物理内存用完时,可以将一些很久没用到的value 交换到磁盘 | 无 |
自动分布式存储 | 支持 | 依赖客户端实现 |
发布订阅功能 | 支持 | 不支持 |
Memecache把数据全部存在内存之中,闪退或断电后会挂掉,数据不能超过内存大小。
Redis可以对数据持久化,并使用VM,当内存空间不够时会将长期没有使用的数据备份到磁盘中。
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
.String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
实例
redis 127.0.0.1:6379> SET name "hello" OK redis 127.0.0.1:6379> GET name "nihao"在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 runoob,对应的值为 hello
注意:一个键最大能存储 512MB。
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
redis 127.0.0.1:6379> HMSET myMap field1 "Hello" field2 "World" "OK" redis 127.0.0.1:6379> HGET myMap field1 "Hello" redis 127.0.0.1:6379> HGET myMap field2 "World"实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
redis 127.0.0.1:6379> lpush mylist mongodb (integer) 2 redis 127.0.0.1:6379> lpush mylistrabbitmq (integer) 3 redis 127.0.0.1:6379> lrange mylist0 10 1) "rabbitmq" 2) "mongodb" 3) "redis" redis 127.0.0.1:6379>列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
Set(集合)
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返
实例
redis 127.0.0.1:6379> DEL myset redis 127.0.0.1:6379> sadd myset redis (integer) 1 redis 127.0.0.1:6379> smembers myset 1) "redis"注意:如果集合中同样胡内容被添加两次,第二次会被忽略
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | 一切皆有可能 |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性, |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
未完待续
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。