一、Redis概述
在传统的java web项目中基本都使用数据库进行存储数据,但是使用数据库会有一些弊端,主要是性能方面,因为数据库持久化数据主要是面向磁盘的,而磁盘的读写速度又比较慢,因此在一般的管理系统中使用数据库来存储数据,因为它不存在高并发,没有瞬间需要读写大量数据的请求。而在互联网中则不同,互联网项目存在高并发场景,需要在一秒或者更少的时间内读写大量的数据,这时用传统的数据库存储方式就无法满足需要,因此需要引入NoSQL技术,NoSQL也是一种简易的数据库,主要是基于内存的数据库,并且提供一定的持久化功能。
Redis和MangoDB是当前使用最广泛的NoSQL。NoSQL数据库强调BASE原则(基本可用(Basically Available)、软状态(Soft-state)、最终一致性(Eventual Consistency)它减少了对数据的强一致性支持,从而获得了基本一致性和柔性可靠性,并且利用以上的特性达到了高可靠性和高性能,最终达到了数据的最终一致性。
Redis性能十分优越,可以支持每秒十几万次的读写操作,其性能远超数据库,并且支持集群、分布式、主从同步、发布订阅消息模式、主从复制、持久化等功能,原则上可以无限扩展,让更多的数据存储在内存中,它还支持一定的事务能力,这在高并发访问的场景下保证数据安全和一致性特别有用。
redis中默认有编号0-15总共16个db,默认使用db0。redis中,数据库是由一个整数索引标识,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0。这个数据库个数是可以通过redis配置文件修改的。
可以使用select命令来切换到不同的数据库中,每个数据库都有属于自己的空间,不必担心key冲突。不同的数据库下,相同的key取到各自的值。
redis一个实例能存多少个key? 官方说单例能处理key:2.5亿个,一个key或是value大小最大是512M。 参考链接:https://redis.io/topics/faq 获取更多信息
Redis主要应用于两个场景:
1、缓存常用的数据;
2、在需要高速读写的场合使用它来快速读写,例如抢红包,秒杀等场景。
在使用redis作为缓存的时候需要从3个方面考虑:
1、业务数据常用吗?命中率如何?如果命中率低就没有必要写入缓存。
2、该业务数据是读操作多还是写操作多?如果写操作多,需要频繁写入数据库,也没有必要使用缓存。
3、业务数据大小如何?如果要存储几百兆字节的文件,会给缓存带来很大的压力,这时需要考虑有无必要。
二、Redis性能优越
Redis的性能优越主要来自3个方面:
首先,它是基于ANSIC语言编写的,接近于汇编语言的机器语言,运行十分快速。
其次,它是基于内存的读写,速度自然比数据库的磁盘读写要快得多。
最后,它的数据库结构只有6种数据类型,数据结构比较简单,因此规则较少,而数据库则是范式、完整性、规范性等需要考虑的规则比较多,处理业务会比较复杂。
所以一般而言Redis的速度是正常数据库的几倍到几十倍,如果把命中率高的数据存储在redis上,那么通过redis读写和操作这些数据,系统的性能将会远超使用数据库的情况。
三、Windows下Redis的基本安装和使用
可参考:https://www.runoob.com/redis/redis-install.html
下载之后解压,然后cmd进入目录,输入redis-server.exe redis.windows.conf
命令即可启动redis,出现如下则表示启动成功。
redis自带有一个客户端工具,redis-cli.exe ,双击即可启动,注意,需要服务启动之后这个客户端才能启动,否则无法启动,会显示计算机积极拒绝无法连接。
四、Redis的6种数据结构
Redis是一种基于内存的数据库,并且提供了一定的持久化功能,它是一种键值对(key-value)数据库,使用key作为索引找到当前缓存的数据并且返回给程序调用者。
redis有如下6种数据结构:
1、字符串(String);
2、列表(List);
3、集合(set);
4、有序集合(zset);
5、哈希结构(hash);
6、基数(HyperLogLog)。
如下表所示:
数据类型 | 数据类型存储的值 | 说明 |
---|---|---|
String(字符串) | 可以保存字符串、整数、浮点数 | 可以对字符串进行操作,如增加字符串或者求子串;如果是整数或浮点数,可以实现计算,如自增等。 |
List(列表) | 它是一个链表,它的每一个节点都包含一个字符串 | redis支持从链表的两端插入或弹出节点,或通过偏移对它进行裁剪;也可以读取一个或多个节点,根据条件删除或查找节点等。 |
Set(集合) | 无序且唯一,每一个元素都是一个字符串 | 可以新增、读取、删除单个元素;判断一个元素是否在集合中;计算它和其他集合的交集、并集和差集等;也可以随机读取元素。 |
ZSet(有序集合) | 有序,可以包含字符串、整数、浮点数、分值,元素的排序是根据分值的大小来决定的 | 可以增、删、查、改元素,根据分值的范围或者成员来获取对应的元素。 |
Hash(哈希散列表) | 类似map、是一个键值对应的无序列表 | 可以增、删、查、改单个键值对,也可以获取所有的键值对。 |
HyperLogLog(基数) | 它的作用是计算重复的值,以确定存储的数量 | 只提供基数的运算,不提供返回的功能 |
以上资料整理于《java EE 互联网轻量级框架整合开发》一书。
参考资料:
(1) https://baike.baidu.com/item/Redis/6549233?fr=aladdin (百度百科对redis的简介)
(2) https://blog.csdn.net/hudashi/article/details/51163757 (redis的简介与使用)
(3) https://www.jianshu.com/p/75441d442266 (对redis的解读很好,并且参考链接很有阅读价值)
(4) https://www.cnblogs.com/laijinquan/p/13573125.html (redis常用命令、模糊搜索等)
(5) https://blog.csdn.net/u012946310/article/details/82312843 (redis desktop manager可视化工具,提供了console,可以直接输入基本的redis命令)
(6) https://blog.csdn.net/atu99602/article/details/101660179?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242 (常用命令)
(7) http://redisdoc.com/index.html (redis 中文文档翻译版)
(8) https://redisbook.readthedocs.org/en/latest/ (Redis 设计与实现)