1.Redis(简单的,高效的,分布式,基于内存的缓存机制)
1.1 性能极高:
- 读 110000次/s
- 写 81000次/s
1.2 丰富的数据类型:
- String,List,Hash,Set,Ordered Set
1.3 Redis操作都是具有原子性的
1.4 Redis单个Key能存入512M大小
2.Redis 数据类型
2.1 String
2.1.1 String类型常用命令:
-
赋值语法:
set key value:设置Key的值,如果key已经存在则覆盖。
++setnx key value:只有key不存在时设置key的值(解决分布式锁方案之一)。++ -
取值语法:
get key : 获取key对应的值,如果key不存在则返回nil。
getrange key start end :对获取key对应的值进行截取。
getbit key offset :对key所存储的字符串值,获取指定偏量上的位(bit)。
mget [key1,key2…] : 获取给定一个或多个key的值。
getset key value : 该语法用于设定key的值并返回旧值。
strlen key :返回key存储字符串的长度。 -
删除语法:
del key : 删除指定的key,如果存在返回数字类型。 -
自增自减:
incr key : incr命令将key的值增一。如果key不存在,那么key的值先被初始化为0,然后在执行incr操作+1。
decr key : decr命令将key的值减一。如果key不存在,那么key的值先被初始化为0,然后在执行incr操作-1。
incrby ken 增加量 : incrby命令将key中存储的数字加上指定的增加量。
decrby key 减少量 : decrby命令将key中存储的数字减去指定的减加量。
- 字符串拼接:
append key value :append命令用于指定key追加至末尾,如果不存在就为其赋值。
2.1.2 String类型应用场景:
- String常用于保存单个字符串或者json字符串数据。
- 因为String时二进制安全的,所以你完全可以把一个图片文件内容作为字符串存储。
- 计数器(常规的key——value缓存应用常用计数,微博中粉丝数):
incr等指令本身就具有原子性操作的特征,因此我们可以利用redis的incr,incrby,decr,decrby等指令实现原子计数的效果。
2.2 哈希(Hash)
2.2.1 简介
Redis hash 是一个sting类型的filed和value的映射表,hash非常适合存储对象。Redis中hash可以存储 2的32次方-1 键值对(40多亿)可以看成具有key和value的MAP容器。该类型占用很少的磁盘空间(相比于json)
2.2.2 Hash 命令
- 赋值语法 :
hset key field value : 为指定的key设置 k/v(域/值)。
hmset key field value [field,value]… : 同时将多个field-value对设置到哈希表key中。 - 取值语法
hget key field : 获取存储在hash中的值,根据field得到value。
hmget key field [field1…] : 获取key给定所有field字段的值。
hgetall key : 返回hash表中该key存储所有的字段和值。 - 删除语法
hdel key field1 [field2] : 删除一个或多个hash表字段。 - 其他语法
hsetnx key field value : 只有字段field不存在时,设置哈希表字段的值。
hincrby key field increment : 为哈希表key中指定的字段的整数增加上增量increment。
hincrbyfloat key field increment : 为哈希表key中指定的字段的浮点数增加上增量increment。
hexists key field : 查看hash表key中指定的字段是否存在。
2.3 List类型
2.3.1 简介
Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列的头部(左边)或者尾部(右边)类似于java中的LinkedList
2.3.2 命令
- 赋值语法:
lpush key value1 [value2] : 将一个或多个值插入到列表头部(从左侧添加)。
rpush key value1 [value2] : 在列表中添加一个或多个值(从右侧添加)。
lpushx key value : 将一个值插入到也存在的列表头部。如果列表不存在,操作失效。
rpushx key value : 一个值插入也存在的列表尾部(最右边)。如果列表不存在,操作无效。 - 取值语法:
llen key : 获取列表长度。
lindex key index : 通过索引获取列表中的元素。
lrange key start stop : 获取指定列表范围内的元素。
描述: 返回类表中指定区间内的元素,区间以偏移量start 和stop指定。其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推。也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
- 删除语法:
lpop key : 移除并获取列表的第一个元素(从左侧删除)。
rpop key : 移除列表的最后一个元素,返回值为移除的元素(从头测删除)。
blpop key1 [key2] timeout : 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表值到等待超时或发现可弹出元素为止。
brpop key1 [key2] timeout : 移除并获取列表的最后一个元素,如果列表中没有元素,会阻塞列表直到等待超时或发现可弹出元素为止。
ltrim key start stop : 对一个列表进行修建(trim),就是说让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 - 修改语法:
lset key index value : 通过索引设置列表元素的值。
linsert key before/after word value : 在列表的元素之前或者后插入元素(将值value插入到列表key当中位于值world之前或之后)。 - 高级语法
brpoplpush source destination timeout : 从列表中弹出一个值,将谈粗的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
rpoplpush source destination : 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
示例描述:
rpoplpush a1 a2 : a1的最后一个元素添加到另一个列表并返回。
rpoplpush a1 a1 : 循环列表,将最后一个元素移到最左侧。
2.3.3 List类型应用场景
- 对数据量大的集合数据删减
列表数据显示,关注列表,粉丝列表,留言评论等…分页,热点新闻等。
利用lrange还可以很方便的实现分页的功能, 评论也可以存入一个单独的list中。 - 任务队列
list通常用来实现一个消息队列,而且可以确保先后顺序,不必像mysql那样还需要通过order by 来进行排序
2.4 Set类型
2.4.1 Set类型简介
- Redis的Set是String类型的无须集合。集合成员是唯一的, 这就意味着集合中不能出现重复的数据。Redis中集合对象Set的底层存储结构特别神奇,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。intset内部其实就是一个数组(int8_t conentents[]数组),而且存储数据的时候是有序的,因为在查找数据的时候是通过二分查找来实现的。
2.4.2 Set命令
- 赋值语法:
sadd key member1 [member2] : 向集合添加一个或者多个成员。 - 取值语法:
scard key : 获取集合的成员数量。
smembers key : 返回集合中的所有成员。
sismember key member : 判断member元素是否是集合key的成员(开发中:验证是否存在的判断)
srandmember key [count] : 返回集合中一个或者多个随机数 - 删除语法:
srem key member1 [member2] : 移除集合中一个或者多个成员。
spop key [cont] : 移除并返回集合中的一个随机元素。
smove source destination member : 将member元素从source集合移动到destination集合。 - 差集语法:
sdiff key1 [key2] : 返回给定所有集合的差集(左侧为准);
sdiffstore destination key1 [key2] : 返回给定所有集合的差集并存储在destination中。 - 交集语法:
sinter key1 [key2] : 返回给定所有集合的交集(共有数据);
sinterstore destination key1 [key2] : 返回给定所有集合的交集并存储在destination中; - 并集语法:
sunion key1 [key2] : 返回所有给定集合的并集;
sunionstore destination key1 [key2] : 所有给定集合的并集存储在destination 集合中
2.4.3 Set类型应用场景
- 常用于对两个集合间的数据计算进行交集,并集, 差集运算
- 以非常方便的实现如同共同关注,共同喜好,二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令 选择将结果返回给客户端还是存到一个新的集合中。
- 利用唯一性,可以统计访问网站的独立IP。
2.5 ZSET(有序集合)
2.5.1 简介
- Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是灭个元素都会关联一个double类型的分数,Redis正是通过分数来为集合中的成员进行从大到小的排序。
- 有序集合的成员是唯一的,但分数却可以重复。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0。集合中嘴的成员数为2的23次方-1 (4294967295,每个集合可存储40多亿个成员)。
- Redis的ZSet是有序,且不重复(很多时候,我们都将redis中的有序集合叫做zsets,这是因为在Redis中,有序集合相关的操作指令都死以z开头的);
2.5.2 命令
- 赋值语法:
zadd key score1 number1 [scoure2 member2] : 向有序集添加一个或者多个成员,或者更新已存在成员的分数 - 取值语法:
zcard key : 获取有序集合的成员数;
zcount key min max : 计算在有集合中指定区间分数的成员数;
zrank key member : 返回有序集合中指定成员的索引;
zrange key start stop [winthscores] : 通过索引区间返回有序集合指定区间内的成员(由高到低);
zrevrange key start stop [winthscores] : 返回有序集合中指定区间内的成员,通过索引,分数由高到低; - 删除语法:
del key : 移除集合;
zrem key member [member…] : 移除有序集合中的一个或者多个成员。
zremrangebyrank key start stop : 移除有序集合中给定的排名区间的所有成员(第一名是0);
zremrangebyscore key min max : 移除有序几个中给定的分数区间的所有成员。
2.5.3 ZSET应用场景
常用于排行榜
- 比如twitter 的public timeline 可以用代表时间作为scoure作为存储,这样获取时就是自动按时间排好序的。
- 比如一个存储全班同学成绩的Sorted Set ,其集合value 可以是同学的学号,而score就可以是其考试的分,这样在数据插入集合的时候,就已经进行了天然的排序。
- 还可以用Sorted Set 来做带权重的队列,比如普通消息的score为1 ,重要消息的score为2,这样工作线程就可以选择按score的倒叙来获取工作任务,让重要的任务优先执行。