一、为什么使用redis
MySQL 数据库的数据确实存储在磁盘上,这意味着任何数据的读写操作(如查询、更新等)都会涉及到磁盘I/O。随着数据库访问量的增加,磁盘I/O可能成为性能瓶颈,因为磁盘的读写速度远不及内存。这是因为内存的数据访问速度(通常是纳秒级)比磁盘(毫秒级)快几个数量级。 为了缓解这种性能瓶颈,通常会采用缓存技术。缓存技术的基本思想是将频繁访问的数据存储在内存中,以便快速访问,减少对磁盘的依赖。在这个场景下,Redis 作为一种高性能的键值对数据库(尽管它也支持多种数据结构和更复杂的数据操作),因其极快的读写速度和丰富的数据结构支持,成为了缓存MySQL数据的常用选择。
二、使用 Redis 缓存的好处
1、提升数据访问速度:通过将热点数据(即经常被查询的数据)缓存在内存中,可以显著提高数据的访问速度,降低数据库的负担。
2、缓解数据库压力:随着缓存的介入,许多原本需要直接访问数据库的操作现在可以在缓存中完成,从而减少了数据库的访问次数,降低了数据库的压力。
3、增强系统可扩展性:通过增加缓存层,可以在不增加数据库服务器数量的情况下,通过增加缓存服务器或扩展缓存容量来提升系统的整体性能。
三、redis常见的数据结构
1、string-字符串
2、list-列表
3、hash-哈希
4、set-集合
5、zset-有序集合
四、常见的命令
1、string
1)使用set 设置值 get查看值
命令:set key value (value的值的类型很多)
命令:get key
key和value 都可以为中文, 但是非常不建议, 输入中文时乱码(windows)。
怎样看到中文:输入quit退出,重进输入 redis-cli --raw,以原始的方式进入就能看到中文了。
key是区分大小写的。
2)使用del删除键值对
命令:del key
3)使用exists查看键值对是否存在
命令:exists key
有会显示1,没有会显示0。
4) 使用keys查找所有的键
命令:keys pattern(模式匹配)
*代表所有, *me代表以me结尾。
5) 使用flushall清空所有的键
命令:flushall
6) 使用ttl查看key的过期时间
命令:ttl key
-1代表没有过期时间
7) 使用expire设置过期时间,单位是秒
命令:expire key time
过期后该键值对将被删除。
8) 使用 setex设置键值对时也设置过期时间
命令:setex key time value
9) 使用setnx设置键值对
命令:setnx key value
10) set、setex 、setnx的区别
set直接设置键值对,没有过期时间,对同一个键设置值时会覆盖。
setex设置键值对时会设置过期时间,对同一个键设置值时会覆盖。
setex相当于这两条命令的集合:
set key value
expire key time
setnx设置键值对时会看存不存在,存在则不创建, 无过期时间 Nx 相当于 if not exist。
2、list
1) 使用lpush给列表添加元素,是在头部添加, 最后添加的元素会在最前面
命令:lpush list_name value1 [value2 ….]
2) 使用lrange读取列表中的元素
命令:lrange list_name start_index end_index
0表示第一个元素的索引, -1表示最后一个元素的索引。
3) 使用rpush 在列表的尾部添加元素
命令:rpush list_name value1 [value2…]
4) 使用 lpop 命令删除头部元素
命令:lpop list_name
5) 使用rpop命令删除尾部元素
命令:rpop list_name
6) 使用llen查看列表的长度
命令:llen list_name
7) 使用ltrim来修剪列表, 即删除范围之外的值
命令:ltrim list_name start_index end_index
3、hash
1) 使用hset来存储一个对象
命令:hset key filed value
2) 使用hget来获取key的某一个filed的值
命令:hget key file
3) 使用hgetall获取对象的所有键值对,是成对出现的
命令:hget key
4) 使用hdel删对象的某个filed
命令:hdel key filed
5) 使用hexists查看对象的filed是否存在
命令:hexists key filed
6) 使用hkeys查看key的所有filed
命令:hkeys key
7) 使用hlen查看key的filed的个数
命令:hlen key
4、set
1) 使用sadd添加元素
命令:add set_name value1 [value2 ….]
2) 使用smembers查看集合中的元素
命令:smembers set_name
3) 集合中的元素都是唯一的,如果已经存在, 则再次添加时会添加失败
以前的集合中已经有a, 再次添加时输出0, 表示添加失败。
4) 使用sismember 来判断元素是否再集合中
命令:sismember set_name value
在则输出1,不在输出0
5) 使用srem删除集合中的元素
命令:srem set_name value
5、zset
会通过score值来排序
1) 使用zadd添加元素
命令:zadd set_name score1 value1 score2 value2 [score3 value3 ...]
2) 使用zrange查看元素
命令:zrange set_name start_index end_index [withscores]
不加withscores就不会输出对应的score。
3) 使用zscore查看某一个value对应的score
命令:zscore set_name value
4) 使用zrank查看成员的排名, 排名是从0开始
命令:zrank set_name value
5) 使用zrem删除集合中的某个元素
命令:zrem set_name value
五、发布订阅模式
1、使用subscribe来订阅频道
命令:subscribe chanel_name
2、使用publish向频道发送消息
命令:publish chanel message
另外的终端:
可以多个终端发送消息或者加入频道。
缺点: 1) 无法记录历史消息 2)消息无法持久化
六、地理空间 Geospatial
1、使用geoadd添加地理位置
命令:geoadd key 经度 纬度 地点名
可以一次添加一个, 也可以一次添加多个。
2、使用geopos查看地理位置
命令:geopos key 地点名
3、 使用geodist查看两地的距离,默认单位是m
命令:geodist key 地点名 地点名
单位变成km,在后面加参数km即可。
七、stream
1、使用xadd添创建消息队列
命令:xadd key ID fileld string
*表示自动生成ID。
2、使用xrange查看所有消息
命令:xrange key start stop
注意是'-', '+'。
3、使用xlen查看消息队列的长度
命令:xlen key
4、使用xdel 删除消息
命令:xdel key id
5、使用xtrim删除任意条消息
命令:xtrim key maxlen number
6、给消息手动添加ID
消息的ID格式:数字-数字
7、使用xread读取消息
命令:xread count 消息数 block 为空阻塞的时间 streams stream_name 0
最后一个参数:0:从第一个消息开始;$:从最新的消息开始
八、事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
1、批量操作在发送 EXEC 命令前被放入队列缓存。
2、收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
3、在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
1、开始事务。
2、命令入队。
3、执行事务。
步骤:
1、输入multi进入事务模式
2、输入命令回显queued, 所有的命令被放在队列中等待执行
3、 输入exec 执行队列中的命令