Redis
Redis 是一种基于键值对的NoSQL 我们用它来做数据缓存,减少数据库的压力。我们可以进入一下网站对redis进行学习
http://try.redis.io/
Redis的数据类型
Redis中所有的数据都是以key/value的方式存储的,我们所说的数据类型指的是value,
在Redis中有一下集中数据类型
- String
- Hash
- List
- Set
- ZSet
数据操作
由于Redis是键值存储。我们可以使用set来进行数据的存储,使用get进行数据的读取,使用 del 对数据进行删除
set name "test"这里重复使用set可以对这条数据进行修改
get name => "test"
以原子的方式递增存储在给定键上的值
由于redis可以被多个客户端连接使用,如果多个客户端同时修改一个键,如果使用关系型数据库可以进行锁表操作来避免数据的不一致。在Redis中则使用INCR 以原子的方式递增存储在给定键上的数字。
set count 10
incr count => 11
incr count =>12
Redis中控制键的存在时间
Redis中可以控制key只存在的一段时间,在这段时间内,这个键是存在的,时间到了后,这个键会自动销毁。我们可以使用EXPIRE和TTL命令来操作这个键什么时候删除和查看什么时候删除,TTL命令的返回值是一个整数,-1则是永久存在-2则是不存在。
SET lock "lock"
EXPIRE lock 120 //120秒后会自动删除
TTL lock => 113 //113秒后会自动删除
TTL lock => (integer)-2 //lock 被销毁
Redis中更复杂的数据结构
Redis中还可以存一些更复杂的数据结构
列表
与列表交互的命令有rpush、lpush、llen、lrange、lpop和rpop
rpush:将新值放在列表的末尾
lpush:将新值放在列表的开头
lrange:查询列表的子集,它有两个参数,第一个是指定开始参数起始位置(从0开始)第二个参数是指指定的结束位置(第二个参数如果是-1则表示列出到最后一个)
llen:返回列表的当前长度
lpop:从列表中删除第一个元素并返回它
rpop:从列表中删除最后一个元素并返回它
rpush friends 'alice'
lpush friends 'alice'
lrange friends => "alice" "alice"
llen friends => 2
lpop friends => "alice"
rpop friends => nul
集合
集合类似于列表,但是集合里面不能存储相同的值,并且集合的存储是无序的,使用集合的命令有是sadd、srem、sismember、smembers和sunion
sadd:将给定值添加到集合中
srem:从集合中删除给定值
sismember:测试给定值是否在集合中,如果在,则返回1,如果不在则返回0 *
smemebrs:返回此集合中所有成员的列表
sunion:两个或多个集合组合并返回所有元素的列表
sadd super 'fly'
srem super fly
sismember super 'fly' => 0
sismembers => nul
sadd bired 'fly'
sunion super bired => "fly"
Sorted Sets(有序集合)
集合本生是没有排序的,但是由于它们未排序,因此无法解决许多问题。redis 1.2 中引入了Sorted Sets(有序集合)。有序集合类似于常规集。
zadd: 添加一个有序集合,它有两个参数,第一个是排序的优先级,第二个是值。
zrange:查看一个有序集合某一区间内的值。它也有连个参数,第一个是查找的起始位置,第二个是结束位置,第二个如果是-1则表示查到最后
zadd black 1101 'alice'
zadd black 1111 'jack'
zrange black 0 -1 => "alice" "jack"
Hashes
Redis 中Hashes是字符串字段与字符串值之间的映射,因此它们是表示对象的完整数据类型
hset:redis中hashes中存储数据的命令,它支持一次存储多个hashes数据
hgetall:获取所有保存的数据
hget:获取一个可能存在的字段值
hdel:删除某一个字段
hincrby:以原子的方式递增
hset user name 'john smith' email 'john.simith@example.com'
hgetall user => "name" "john smith" "email" "john.simith@example.com"
hget user name => "john smith"
hset count visits 10
hincrby count visits 1 => 11
hdel count vistis
Redis中的各类型应用场景
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
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、带权重的消息队列 |