前言
上学期利用暑假时间学习了HBase列式存储数据库,这学期一直没时间去系统的完整的学习键值对数据Redis,恰好疫情无法正常回校,就利用在家的时间简单的学习了Redis,在此进行汇总记录。参考的书籍主要是:《Redis入门指南》、《Redis设计与实现》及《Redis实战》
Redis是什么
REmote DIctionary Server(远程字典服务器),是一个开源、高性能、基于键值对的缓存与存储系统,可通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。由C语言编写,基于内存和持久化的日志型、key-value数据库,可提供多种语言API。
Redis是一个使用内存存储的非关系型数据库(NoSQL),其高层级功能使其可胜任消息队列、任务队列(list数据类型)等不同角色。
Redis是一个远程内存数据库,具有复制特性,提供五种数据结构(key与五种不同类型value的映射,需要注意的是key就是key,五种数据类型指的是value的不同,value可以是string、hash、list、set和zset,其中每个key对应这些类型的value),致力于帮用户解决问题而非让用户扭曲问题来使用数据库。通过复制(replication)、持久化(persistence)和客户端分片(client-side sharding)特性,可将Redis扩展成一个能包含数百GB数据、每秒处理上百万次请求的系统。
Redis相比较其他数据库而言所具有的优势:性能高(读的速度是110000次/s,写的速度是81000次/s);数据类型丰富(string、list、hash、set、zset);操作原子性(事务操作要么成功,要么失败无回滚机制);支持publish/subscribe、TTL等
Redis的特点
-
以字典结构(或称映射、关联数组)存储数据,并允许其他应用通过TCP协议读写字典中的内容。Redis字典中的键值数据类型有String字符串类型、Hash散列类型、List列表类型、Set集合类型和ZSet有序集合类型。
-
所有数据存储在内存中。读性能>写性能(内存读写速度远快于硬盘);Redis提供对持久化的支持,即可将内存中的数据异步写入硬盘中,以防程序退出后内存中数据丢失
-
设置TTL,生存时间到期后键会自动被删除;限定数据占用的最大内存空间,在数据达到空间限制后可按照一定的规则自动淘汰不需要的键;列表类型键可用来实现队列,并支持堵塞式读取,易于实现一个高性能的优先级队列;支持“发布/订阅”的消息模式(可基于此构建聊天室等系统)
-
支持数据备份,即master-slave模式的数据备份(数据存在多个slave中)
-
次版本号(即小数点后的数字)为偶数的版本是稳定版,奇数的版本为非稳定版。生产环境一定使用稳定版本
什么时候用Redis
Redis的两个最大的实际应用就是作为数据库;作为缓存机制。对于前者适用于数据较少读需求大的场景;对于后者适用于大数据量下读需求大的场景可以将常用的稳定的数据放在Redis中,查询数据时直接在Redis中进行查询而非去RDBMS等数据库中查询
-
缓存(数据查询、短连接、新闻内容、商品内容等)(String)
-
聊天室的在线好友列表(list)
-
任务队列(秒杀、抢购、12306等)(set)
-
应用排行榜(zset)
-
网站访问统计
-
数据过期处理(可精确到毫秒)
- 分布式集群级架构中的session分离
-
取最新N个数据的操作,如可将最新的10条评论ID放在Redis的List集合中(双向链表,FILO)
Redis的数据类型
Redis支持五种数据类型,分别是String、list、hash、set、zset,以下进行详细说明。
- 字符串类型String
Redis数据中键都是字符串类型。二进制安全,可存储任何数据包括图片/序列化对象。底层实现使用SDS结构,SDS存储结构支持内存预分配(用于优化SDS字符串增长操作,不仅分配增长字符串所需要的空间,还会额外分配未使用空间)+惰性空间释放(用于SDS字符串缩短操作,程序不会回收缩短后多出来的空间,而是记入free以供下次使用。避免内存重分配操作,也为将来增长操作提供优化(减少重分配次数)。)
Redis字符串数据类型中字符串可存储三种类型的值:
-
字节串(byte string)
-
整数
-
浮点数
其他数据类型值均为字符串类型(内含这三种类型值的字符串)
- 列表类型list
内部使用双向链表实现,故向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度越快。但代价是通过索引访问元素较慢,特点是新增元素直接排到列表末尾即可(这种特性使得列表类型能快速完成RDBMS中难以应付的场景:社交网站关注的是最新的消息,可使用Redis的列表数据类型呈现列表末尾的数据以显示最新的数据即最后加入列表的数据)
底层使用链表结构实现存储
- 哈希类型hash
散列类型(hash)的键值也是一种字典结构,存储字段(field)和字段值的映射,字段值只能为字符串类型。散列类型的键可包含之多223-1个字段。适合存储适用于对象类别和ID构成键名、字段表示对象的属性、字段值存储属性值的对象
底层通过字典结构/压缩列表结构实现存储。
- 集合类型set
内部使用压缩表/值为空的散列表(hash table)实现,加入/删除/判断元素是否存在等操作的时间复杂度为O(1),多个集合间可进行并集、交集和差集运算
- 有序集合类型zset
在集合类型基础上添加有序的功能,与列表类型相比,有序集合类型内部使用散列表和跳跃表(skip list)实现、数据查找的时间复杂度为O(LOG(N))、可随意调整某个元素的位置(通过修改元素的score)、更耗费内存
Redis的常用命令
Redis的常用命令分为Key、五种数据类型以及一些常用的其他命令进行总结说明。Redis不区分大小写(与HBase不同)
- KEY
- KEYS pattern:获得符合规则的键名列表(pattern支持glob风格通配符格式,支持?匹配一个字符、*匹配所有字符、[]匹配其中任意字符、\x转义匹配字符x)
-
EXISTS key:判断一个键是否存在。存在返回整数值1,否则返回0
-
DEL key:删除键。删除成功返回整数值1,否则返回0
-
TYPE key:获得键值的数据类型,返回值可为string、hash、list、set、zset
- String
-
SET key value:创建string类型键值对 单值单value,对于同一个键只能有一个value,如果再次对同一个键执行SET命令会将旧的键对应的值替换掉
-
GET key:获取string类型的值
-
增加指定整数 INCRBY key increment(增1为INCR key)
-
减少指定整数 DECRBY key increment(减1为DECR key)
-
获取key对应的字符串value的字符串长度 STRLEN key
-
同时设置多个键值 MSET key1 value1 key2 value2
-
同时获得多个键值 MGET key1 key2...
-
SETRANGE key n xxx:从key对应的value的第n位开始改为xxx,结果返回value的字符串的字符个数
-
SETNX key value:当key不存在时添加key-value
-
MSETNX key1 value1 key2 value2:多个不存在时添加多个key-value(原子性操作,其中有一个SET失败则整条命令全失败)
- list
-
向列表两端添加元素:向列表左侧添加元素LPUSH key value[value2 value3 ...]支持同时添加多个元素;向列表右侧添加元素RPUSH key value(结果返回此时列表中元素的个数
-
从列表两端弹出元素:从左侧LPOP key;从右侧RPOP key(弹出即删除列表中的元素,如果想要查询列表中元素切记不要使用此命令,应使用LRANGE key start end)
-
获取列表中元素的个数:LLEN key(key不存在时返回0)
-
获取列表片段:LRANGE key start end
-
删除列表中指定的值:LREM key count value
-
只保留列表指定片段:LTRIM key start end
- hash
-
赋值 HSET key field value
-
取值 HGET key field
-
赋多个值 HMSET key field1 value1 field2 value2
-
取所有值 HGETALL key
-
判断字段是否存在 HEXISTS key field(存在返回1,否则返回0)
-
当字段不存在时赋值 HSETNX key field value
-
增加数字 HINCRBY key field increment
-
删除字段 HDEL key field(返回被删除字段的个数)
-
获得字段数量 HLEN key【field是字段,value是字段值,字段个数算的是field的个数】
- set
-
增加元素:SADD key member[member1 member2 ...]可同时添加多个元素
-
删除元素:SREM key member[member1 member2 ...]可同时删除多个元素
-
获取集合中的所有元素:SMEMBERS key
-
判断元素是否在集合中:SISMEMEBER key member(存在则返回1,否则返回0)
-
获得集合中元素个数:SCARD key
-
集合间运算:SDIFF key1 key2(key1-key2差集运算);SINTER key1 key2(key1 key2交集运算);SUNION key1 key2(key1 key2并集运算)
- zset
-
添加元素:ZADD key score member[score1 member1 score2 member2 ...]可同时添加多个元素
-
获得元素的分数:ZSCORE key member
-
获取集合中元素的数量:ZCARD key
-
获取指定分数范围内的元素个数:ZCOUNT key min max
-
按照排名范围删除元素:ZREMRANGERBYRANK key start stop,结果返回成功删除的元素个数
-
按照分数范围删除元素:ZREMRANGERBYSCORE key min max 结果返回成功删除的元素个数
- 位运算
-
GETBIT key offset获取偏移量
-
SETBIT key offset value 设置位值
-
BITCOUNT key start end 计算从start位到end位中1的个数(二进制,非0即1)
-
BITOP operation destkey key1 key2... 对key1和key2进行operation操作,后将结果存储在destkey参数中,其中operation一般有AND、OR、XOR、NOT
总结
此处只是简单罗列基本的使用命令,后续根据问题为索引进行Redis相关知识更新。