1 redis与mysql
1.1 使用场景
Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine.
这句话是我们从redis的官网找到的,翻译过来就是:
Redis是一个开源(BSD许可)的内存中数据结构存储,用作数据库、缓存、消息代理和流媒体引擎
redis是数据库,mysql也是数据库,什么时候该用redis,什么时候用mysql?
- 首先redis是存储在内存中的,学过计算机组成原理的我们都知道内存的读写性能是很快的,而mysql是存储在磁中的,磁盘的读写性能有很慢。所以当需要短时间内大量的读操作时,redis其读写速度非常快,可以用作缓存数据,提高系统的性能。例如不同网站的首页时访问次数一定最多的,所以首页的数据一般存储在redis中。
- 如果存在不需要持久化的数据时可以选择使用redis,比如点赞数、验证码。
- redis做缓存,Redis用来提高其他访问较慢的数据库(如MySQL)的读取速度。由于Redis数据存储在内存中,访问速度非常快,可以达到毫秒级的延迟。并且Redis的所有操作都是原子的,因此也可以用作分布式锁等需求。
也就是当存在数据量大、查询频繁时,数据库有压力的时候使用redis做缓存可以减轻数据库的压力。
1.1.1 内存与磁盘的区别
|
|
|
---|---|---|
数据易失性 | 易失性:断电后数据会丢失 | 非易失性:断电后数据依然保存 |
读写速度 | 非常快,远高于硬盘 | 相对较慢 |
存储容量 | 相对较小,价格较高 | 大,价格对于其存储容量来说较便宜 |
存储形式 | 临时存储数据,主要用于执行程序时 | 长期存储数据,保存文件与程序 |
1.2 查询的底层逻辑
- MySQL使用B+树作为其主要的索引结构,MySQL接收到SQL查询请求时,会先对SQL语句进行词法和语法解析,检查语句的语法是否正确,生成一个解析树,通过查询优化选择成本最低的执行计划,然后按选定的路径访问表和索引,检索出结果集。
- redis是一个键值对数据库,查询操作主要通过key去查找value。由于所有数据都存储在内存中,因此Redis能够提供极快的查询速度。
2 redis的数据结构及其应用场景
redis的存储是以key-value的键值对的形式存储的,其中key都是String类型,value则是有很多种的,例如:String,Map,list,set等类型。
2.1 String
字符串类型,可以包含任何数据,最大能存储512MB。
常见指令
set name zhansan --存放字符串键值对
mset name lisi age 18 --批量存放键值对
get name -- 获取key
mget name age --批量获取key
DEL key -- 删除key
expire key 60 --设置过期时间,单位为秒
INCR key -- 将key中存储的数字加1
DECR key -- 将key中存储的数字减1
应用场景
- 将网页、图片、文档等内容作为字符串值缓存,以提高系统的响应速度。
- Redis提供了INCR, DECR等原子操作命令,所以String可以被用作计数器,如网站访问量等。
2.2 Hash
即是一个键值对集合,是一个string类型的field和value的映射表,其值的存储结构跟Java的HashMap类似。
常见指令
hset hash name zhencong --设置值,
hget hash name -- 获取值
hmset hash name zhencong age 18 --批量设置
hmget hash name age --批量获取
hgetall hash 获取key的所有值
hkeys hash 获取hashmap中所有的key
hvals hash 获取hashmap中所有的value
应用场景
- 可以用于存储系统中对象的数据。
- 也可以用于做缓存,来解决数据一致性的问题(不推荐)。
2.3 List
即是简单的字符串列表,按插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
常见指令
rpush myList valu5e1 --向 list 的头部(右边)添加元素
rpush myList value2 value3 --向list的头部(最右边)添加多个元素
lpop myList # 将 list的尾部(最左边)元素取出
rpop myList2 value1 --尾插
实现栈(LIFO):
应用场景
- 可以实现栈和队列。
- 可以作为一个简单的消息队列来使用。
2.4 Set
是字符串的无序集合。添加、删除、查找的复杂度都是O(1)。
常见指令
sadd key n1 [n2] 向集合添加一个或多个成员。
scard key 获取集合的成员数
sunion key1 [key2] 返回所有给定集合的并集。
sdiff key1 [key2] 返回给定所有集合的差集。
sinter key1 [key2] 返回给定所有集合的交集。
sismember key n 判断n元素是否是集合key的成员
smembers key 返回集合中的所有成员
应用场景
- 可以用来计算多个数据源的交集,差集,并集等操作。比如两个用户的共同好友,某用户喜欢的图书类型,相同的地方等等。
- 可以实现统计网页访客数量,IP去重等功能。
2.5 Sorted Set
或者叫做有序集合,是通过哈希表实现的,但它增加了一个顺序属性,这使得我们可以实现一些有特殊排序需求的功
能。
应用场景
实时排行
2.6 其他结构
- 位图(Bitmaps),实际上就是特殊的字符串,主要是通过指定偏移量来对字符串的位进行操作。
- HyperLogLogs,它是用来做基数统计的,这个数据结构虽然功能强大,但是并不常用。