Redis 是彻底开源免费的,遵照 BSD 协议,是一个高性能的 key - value 数据库java
Redis 与 其余 key - value 缓存产品有如下三个特点:redis
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 支持 5 中数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)。网站
string :string 是 redis 最基本的数据类型。一个 key 对应一个 value。string 类型的值最大能存储 512 MB
string 是二进制安全的。也就是说 redis 的 string 能够包含任何数据。好比 jpg 图片或者序列化的对象。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
hash:Redis hash 是一个键值对(key - value)集合。
Redis hash 是一个 string 类型的 key 和 value 的映射表,hash 特别适合用于存储对象。
理解:能够将 hash 当作一个 key - value 的集合。也能够将其想成一个 hash 对应着多个 string。
与 string 区别:string 是 一个 key - value 键值对,而 hash 是多个 key - value 键值对。也就是key:object object里面封装:多个键值对
// hash-key 能够当作是一个键值对集合的名字,在这里分别为其添加了 sub-key1 : value一、sub-key2 : value二、sub-key3 : value3 这三个键值对
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
127.0.0.1:6379> hset hash-key sub-key3 value3
(integer) 1
// 获取 hash-key 这个 hash 里面的全部键值对
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
5) "sub-key3"
6) "value3"
// 删除 hash-key 这个 hash 里面的 sub-key2 键值对
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 1
127.0.0.1:6379> hget hash-key sub-key2
(nil)
127.0.0.1:6379> hget hash-key sub-key1
"value1"
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key3"
4) "value3"
list:Redis 列表是简单的字符串列表,按照插入顺序排序。咱们能够网列表的左边或者右边添加元素。
咱们能够看出 list 就是一个简单的字符串集合,和 Java 中的 list 相差不大,区别就是这里的 list 存放的是字符串。list 内的元素是可重复的。
127.0.0.1:6379> rpush list-key v1
(integer) 1
127.0.0.1:6379> rpush list-key v2
(integer) 2
127.0.0.1:6379> rpush list-key v1
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1
1) "v1"
2) "v2"
3) "v1"
127.0.0.1:6379> lindex list-key 1
"v2"
127.0.0.1:6379> lpop list
(nil)
127.0.0.1:6379> lpop list-key
"v1"
127.0.0.1:6379> lrange list-key 0 -1
1) "v2"
2) "v1"
set:redis 的 set 是字符串类型的无序集合。集合是经过哈希表实现的,所以添加、删除、查找的复杂度都是 O(1)。
redis 的 set 与 java 中的 set 仍是有点区别的。redis 的 set 是一个 key 对应着 多个字符串类型的 value,也是一个字符串类型的集合,可是和 redis 的 list 不一样的是 set 中的字符串集合元素不能重复,可是 list 能够。
127.0.0.1:6379> sadd k1 v1
(integer) 1
127.0.0.1:6379> sadd k1 v2
(integer) 1
127.0.0.1:6379> sadd k1 v3
(integer) 1
127.0.0.1:6379> sadd k1 v1
(integer) 0
127.0.0.1:6379> smembers k1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379>
127.0.0.1:6379> sismember k1 k4
(integer) 0
127.0.0.1:6379> sismember k1 v1
(integer) 1
127.0.0.1:6379> srem k1 v2
(integer) 1
127.0.0.1:6379> srem k1 v2
(integer) 0
127.0.0.1:6379> smembers k1
1) "v3"
2) "v1"
Zset:redis zset 和 set 同样都是 字符串类型元素的集合,而且集合内的元素不能重复。
不一样的是 zset 每一个元素都会关联一个 double 类型的分数。redis 经过分数来为集合中的成员进行从小到大的排序。
zset 的元素是惟一的,可是分数(score)却能够重复。
zset 是按照 分输的大小来排序的。
127.0.0.1:6379> zadd zset-key 728 member1
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
127.0.0.1:6379> zrem zset-key member1
(integer) 1
127.0.0.1:6379> zrem zset-key member1
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"
小总结:
类型简介特性场景string(字符串)二进制安全能够包含任何数据,好比 jpg 图片或者序列化的对象,一个键最大能存储 521M---Hash(哈希)键值对集合,即编程语言中的 Map 类型适合存储对象,而且能够像数据库中 update 同样只修改某一项属性值存储、读取、修改用户属性List(列表)双向链表增删快,提供了操做某一段元素的 API一、最新消息排行等功能(朋友圈的时间线)
消息队列Set(集合)哈希表实现,元素不能重复添加删除查找的复杂度都是 O(1);为集合提供了求交集、并集、差集等操做共同好友;利用惟一性,统计访问网站的全部独立 ip;好友推荐时,根据 tag 求交集,大于某个阈值就能够推荐Zset(有序集合)将 Set 中的元素增长一个权重参数 score,元素按 score 有序排列数据插入集合时,已经进行自然排序排行榜;带权重的消息队列。