文章目录
一、Redis的简介
1.1 Redis基本信息
- Redis是当前互联网世界最流行的NoSQL(Not Only SQL)数据库,NoSQL在互联网系统中的作用很大,因为它可以在很大程度上提高互联网的性能。
- Redis具备一定持久层的功能,也可以作为一种缓存工具,对于NoSQL数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。
- 对于那些结构化,多范式的数据库系统而言,它更具性能优势,作为缓存,它可以支持大数据存入内存,只要命中率高,他就可以快速响应,因为在内存中的数据读写数据库读写磁盘的速度快几十甚至到上百倍。
1.2 Redis的优点
- 因为数据库系统有更好的规范性和数据完整性,功能更加强大,作为持久层更为完善,安全性能也更高,而NoSQL结构松散,不完整,功能有限,但是作为缓存工具,它的高性能,高响应等功能,使它成为一个很重要的工具。
- Redis响应非常快:
- 每秒可以执行大约110000个写入操作,或者81000个读操作,其速度远超数据库,如果存入一些常用的数据,就能有效提高系统的性能。
- 支持6种数据结构
- 他们是字符串,哈希结构,列表,集合,可排序集合和基数。比如对于字符串可以存入一些java数据类型,哈希可以存储对象,列表可以存储List对象等,这使得在应用中很容易根据自己的需要选择存储的数据类型,方便开发。
- 操作都是原子性的
- 所有的Redis操作都是原子性的,从而确保当两个客户同时访问Redis服务器时,得到的是更新后的值,在需要高并发的场合可以考虑使用Redis的事务,处理一些需要的业务。
- MultiUtility工具
- Redis可以在如缓存,消息队列中使用(Redis支持“发布+订阅”的消息模式),在应用程序如Web应用程序会话,网站页面点击数等任何短暂的数据中使用。
- NOSQL从数据库中读取数据进行缓存,就可以从内存中读取数据了,而不像数据库一样读磁盘,现实是读操作远比写操作要多的多,所以缓存很多常用的数据,提高其命中率有助于整体性能的提高,并且能减缓数据库的压力,对互联网系统架构是十分有利的。
- 另一方面,他也可以满足互联网高并发需要告诉处理数据的场合,比如抢红包,商品秒杀等场景,这些场合需要告诉处理,并保证并发数据安全和一致性。
- Redis都是单线程的,避免线程切换来校以及线程竞争的为题
- 支持持久化,Redis总共支持RDB和AOF两种出久华方案,持久化有效避免了数据丢失的问题;
- 支持事务,
- 支持主存复制,主节点将数据通过步给从节点,可以进行读写分离;
1.3 Redis的8个应用场景
- 缓存-热数据
- 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用Redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类型工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外内存中的数据提供了AOF和RDB等持久化机制可以选择。
- 计数器
- 注入统计点击数等应用,由于是单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能。
- 位操作(大数据处理)
- 用于数据量上亿的场景下,例如几亿用户系统签到,去重登陆次数统计,某用户是否在线状态等等;
- 分布式锁与单线程机制
- 验证前端的重复请求(可以自由扩展类似情况),可以通过Redis进行过滤,每次请求将request ip、参数、接口等hash作为key存储在Redis,设置多长时间的有限期,然后下次请求过来的时候现在Redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交秒杀系统,基于Redis是单线程特征,防止出现数据库爆破全局增量ID生成,类似秒杀。
- 最新列表
- 如新闻列表页面更新的新闻列表;
- 排行榜
- 谁得分高排名往上,
- 使用场景
- 数据的高并发的读写;
- 海量数据的续写;
- 对扩展性要求高的数据;
1.4 Redis是单线程
- Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的性能问题来自于机器内存和网络宽带,既然可以使用单线程来实现,那么就使用单线程。
- 单线程的好处
- 避免了过多的上下文的切换的开销
- 避免同步机制的开销,如果是多线程模型,需要考虑数据同步的问题,必然引起同步机制,如锁机制,增加程序的复杂度;
- 实现简单,方便维护
二、Redis的基本操作
- Redis中默认有16个数据库(从0到15),默认使用第0个数据库,可以通过select进行切换。
1 select:
- 切换数据库 ,返回值为OK,即切换数据库成功;
2 dbsize:
- 查看当前数据库中数据的个数,set方法是往数据库中写入数据(返回为OK则表示写入成功)
3 keys
- 查看所有的key,
4 flushdb
- 清空当前数据库,
5 flushall
- 清空所有数据库,
三、Redis基于基本数据类型的命令
String:字符串
- String类型是Redis中的基本类型,一个key对应一个value;
- String类型的值可以使字符串,数字或者是二进制的数据,最大不超过512M;
1 set
- 添加数据
2 get
- 通过key获取值
3 exists
- 判断key是否存在,存在返回1,不存在返回0;
4 append
- 追加字符串,如果key存在,就追加,如果key不存在,相当于set;
5 strlen
- 获取字符串的长度
6 incr & decr
- 对value进行自增加1(自减减1)操作;
- 注意,这里只能对基本数据类型进行操作,字符串会报错
- 如果key不存在,那么value的值先会被初始化为0,然后再进行自增或自减操作;
7 incrby & decrby
- 设置加减的步长,也就是以多少步长进行自增和自减;
8 setrange & getrange
- 从指定位置开始替换字符串中的值,返回值表示value的长度;
9 setex & ttl
- 设置过期时间,查看剩余时间
10 setnx
- 如果key不存在则设置,否则失败不设置,当key存在的时候,就返回1,不存在就返回0;可以基于setnx实现分布式锁。
11 mset & mget
- 批量的插入数据和批量的获取数据
12 getset
- 先获取值,然后再设置值;如果成功,则返回原来的值,否则返回空(nil);
Hash:哈希
- hash类型适合存储对象,hash的命令都是以h开头的
1 hset & hget
- 设置数据和获取数据