Redis-基础知识
Redis 概述
通常涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
NOSQL 技术
Not Only SQL,为了克服上述的问题,Java Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。
Redis和MongoDB是当前使用最广泛的NoSQL,对于Redis,性能十分优越,可以支持每秒十几万次的读/写操作,性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。
Redis 在 Java Web 中的应用
Redis 在 Java Web 主要有两个应用场景:
- 存储 缓存 用的数据;
- 需要高速读/写的场合使用它快速读/写;
缓存
在对数据库的访问中,读操作的次数远超写操作,比例大概在 1:9 到 3:7,所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读写操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。
如果把数据放在Redis 中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,会很快,并且极大减小数据库的压力,但是使用内存进行数据存储开销比较大,限于成本的原因,一般只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。
一般而言在使用 Redis 进行存储的时候,我们需要从以下几个方面来考虑:
- 业务数据常用吗?命中率如何?
- 如果命中率很低,就没有必要写入缓存;
- 该业务数据是读操作多,还是写操作多?
- 如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
- 业务数据大小如何?
- 如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;
KV型NoSql
Redis、MemCache是其中的代表,Redis又是KV型NoSql中应用最广泛的NoSql,KV型数据库以Redis为例,优点有两点:
- 数据基于内存,读写效率高
- KV型数据,时间复杂度为O(1),查询速度快
KV型NoSql最大的优点就是高性能,利用Redis自带的BenchMark做基准测试,TPS可达到10万的级别,性能非常强劲。同样的Redis也有所有KV型NoSql都有的比较明显的缺点:
- 只能根据K查V,无法根据V查K
- 查询方式单一,只有KV的方式,不支持条件查询,多条件查询唯一的做法就是数据冗余,但这会极大的浪费存储空间
- 内存是有限的,无法支持海量数据存储
- 同样的,由于KV型NoSql的存储是基于内存的,会有丢失数据的风险
- 综上所述,KV型NoSql最合适的场景就是缓存的场景:
- 读远多于写
- 读取能力强
- 没有持久化的需求,可以容忍数据丢失,反正丢了再查询一把写入就是了
NoSQL特点
解耦
- 数据之间没有关系,便于扩展
- 数据量高性能
- 数据类型多样型
![image]()
Redis ( Remote Dictionary Server )
远程字典服务
一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
基本的数据结构
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis功能
- 内存存储、持久化,内存中是断电即失、所以说持久化很重要(rdb, aof )
- 效率高,可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器
特性
- 多样的数据类型
- 持久化
- 集群
- 事务
Redis 的安装(windows)
https://github.com/ServiceStack/redis-windows/tree/master/downloads
Redis 下载解压,如下目录

目录下新建一个 startup.cmd 的文件
redis-server redis.windows.conf
这个命令其实就是在调用 redis-server.exe 命令来读取 redis.window.conf 的内容,我们双击刚才创建好的 startup.cmd 文件,就能成功的看到 Redis 启动:

可以打开同一个文件夹下的 redis-cli.exe 文件,是 Redis 自带的客户端工具,可以用来连接到当前的 Redis 服务器,做以下测试:

Redis 的安装(Linux)
[root@misayaq jiaqi]# mv redis-6.0.9.tar.gz /opt
[root@misayaq jiaqi]# cd /opt/
[root@misayaq opt]# ls
containerd redis-6.0.9.tar.gz rh
[root@misayaq opt]# tar -zxvf redis-6.0.9.tar.gz
进入解压后的文件可以看到redis的配置文件

基本的环境安装
yum install gdd-c++
make
make install
redis默认安装路径 usr/local/bin

将redis配置文件 复制到当前目录下

redis默认不是后台启动的 需要修改配置文件
vim redis.conf

启动redis服务

测试连接 使用 redis-cli

查看进程

关闭Redis服务

测试性能
redis-benchmark一个压力测试工具!官方自带的性能测试工具!
压测命令:
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000

简单测试:
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000

查看这些分析

基础知识
redis具有16个数据库

默认使用的是第0个
可以使用select (index)进行切换数据库 ,DBSIZE查看数据库大小
127.0.0.1:6379> clear
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> DBSIZE #查看db大小
(integer) 0

查看数据库所有的key----->keys *
127.0.0.1:6379[3]> keys *
1) "name"
清空数据库 flushall(清空所有db) flushdb(清空当前db)
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> keys *
(empty array)
Redis是单线程的
Redis是基于内存操作, CPU不是Redis性能瓶颈, Redis的瓶颈是根据机器的内存和网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
Redis为什么单线程还这么快
redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作 ) ,对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
- 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用多路I/O复用模型,非阻塞IO;这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
转自 Redis入门-基础知识

浙公网安备 33010602011771号