天津网站制作的公司哪家好,wordpress 短信认证,校园网站建设服务,郑州中原网站建设Redis(Remote Dictionary Server) 是一个使用 C 语言编写的#xff0c;开源的#xff08;BSD许可#xff09;高性能非关系型#xff08;NoSQL#xff09;的键值对数据库。 本篇内容包括#xff1a;Redis 简介#xff08;为什么快#xff1f;为什么单线程#xff1f;优… Redis(Remote Dictionary Server) 是一个使用 C 语言编写的开源的BSD许可高性能非关系型NoSQL的键值对数据库。 本篇内容包括Redis 简介为什么快为什么单线程优点缺点等Redis 在 Java Web 中的应用Redis 安装Win、Linux、Mac 场景下的安装等内容 文章目录一、Redis 简介1、Redis为什么快呢2、Redis为何选择单线程3、那为什么Redis6.0之后又改用多线程呢?4、Redis的优势5、Redis的缺点二、Redis 在 Java Web 中的应用1、Redis 的使用场景2、缓存3、高速读/写的场合三、Redis 安装1、Windows 下安装2、Linux 下安装3、Mac 下安装使用Homebrew一、Redis 简介
Redis 是 C 语言开发的一个开源的遵从 BSD 协议高性能键值对key-value的内存数据库可以用作数据库、缓存、消息中间件等。
它是一种 NoSQLnot-only sql泛指非关系型数据库的数据库。是一种基于内存的数据库并且提供一定的持久化功能。
Redis 作为一个内存数据库性能优秀数据在内存中读写速度非常快支持并发 10W QPS。单进程单线程是线程安全的采用 IO 多路复用机制。丰富的数据类型支持字符串strings、散列hashes、列表lists、集合sets、有序集合sorted sets等。支持数据持久化。可以将内存中数据保存在磁盘中重启时加载。主从复制哨兵高可用。可以用作分布式锁。可以作为消息中间件使用支持发布订阅。
1、Redis为什么快呢
redis的速度非常的快单机的redis就可以支撑每秒10几万的并发相对于mysql来说性能是mysql的几十倍。速度快的原因主要有几点
完全基于内存操作C语言实现优化过的数据结构基于几种基础的数据结构redis做了大量的优化性能极高使用单线程无上下文的切换成本基于非阻塞的IO多路复用机制
2、Redis为何选择单线程
避免过多的上下文切换开销。程序始终运行在进程中单个线程内没有多线程切换的场景。避免同步机制的开销如果 Redis选择多线程模型需要考虑数据同步的问题则必然会引入某些同步机制会导致在操作数据过程中带来更多的开销增加程序复杂度的同时还会降低性能。实现简单方便维护如果 Redis使用多线程模式那么所有的底层数据结构的设计都必须考虑线程安全问题那么 Redis 的实现将会变得更加复杂。
3、那为什么Redis6.0之后又改用多线程呢?
Redis 使用多线程并非是完全摒弃单线程Redis 还是使用单线程模型来处理客户端的请求只是使用多线程来处理数据的读写和协议解析执行命令还是使用单线程。
这样做的目的是因为redis的性能瓶颈在于网络 IO 而非 CPU使用多线程能提升 IO 读写的效率从而整体提高 Redis 的性能。
4、Redis的优势
Redis支持保存多种数据结构支持stringlistsetsorted sethash其单个value的最大限制是1GB因此Redis可以用来实现很多有用的功能因为是纯内存操作Redis的性能非常出色每秒可以处理超过 10万次读写操作是已知性能最快的Key-Value DBRedis也可以对存入的Key-Value设置expire时间因此也可以被当作一 个功能加强版的memcached来用Redis可以将内存的数据利用快照和日志的形式保存到硬盘上这样在发生类似断电或者机器故障的时 候内存中的数据不会“丢失”除了上述功能以外Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。
5、Redis的缺点
Redis的主要缺点是数据库容量受到物理内存的限制不能用作海量数据的高性能读写因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
总之如果在合适的场景使用好Redis它就会像一把瑞士军刀一样所向披靡、无往不利 二、Redis 在 Java Web 中的应用
1、Redis 的使用场景
Redis 根据使用数据类型的不同对应的使用场景有很多例如
缓存String / Hash 类型缓存如用户信息视频信息等分布式锁String 类型setnx 方法「key不存在才插入」可以用它来实现分布式锁计数器String 类型incr/decr 方法自增自减由于是原子性可以用来计数统计浏览数、点赞数等限制请求次数String 类型也是利用 incr 方法限制请求次数访问者的 ip 和其他信息作为 key访问一次增加一次计数超过次数则返回 false数据共享分布式String 类型因为 Redis 是分布式的独立服务可以在多个应用之间共享所有可以实现需要例如分布式 Session购物车Hash 类型类似存储商品信息大 key 为商家 id小 key 是商品 id 即 goodsIdvalue 为该 goodsId 的详细信息消息队列List / Stream 类型二者都可以实现消息队列而 Redis5.0 新增的 Stream解决了 List 实现的消息队列不能持久化和不能重复消费的问题点赞、踩、收藏Set 类型Set 集合无需、不可重复可以保证一个用户只能点一个赞共同关注Set 类型Set 类型支持交集运算所以可以用来计算共同关注的好友、公众号等抽奖活动Set 类型存储某活动中中奖的用户名 Set 类型因为有去重功能可以保证同一个用户不会中奖两次排行榜ZSet 类型有序集合保留了集合不能有重复成员的特性分值可以重复但不同的是有序集合中的元素可以排序所以可以用作排行榜功能的实现此外利用 Redis 的特殊数据类型也可以实现一些相应的功能Bit 位运算用来签到统计、HyperLogLogs 统计基数用来百万级网络 UV还有 GEO 地理位置、用来打车等
2、缓存
在日常对数据库的访问中读操作的次数远超写操作比例大概在 1:9 到 3:7所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读写操作时数据库就会去磁盘把对应的数据索引取回来这是一个相对较慢的过程。
如果我们把数据放在 Redis 中既直接放在内存之中让服务端直接去读取内存中的数据那么这样速度明显就会快上不少并且会极大减小数据库的压力但是使用内存进行数据存储开销也是比较大的限于成本的原因一般我们只是使用 Redis 存储一些常用和主要的数据比如用户登录的信息等。
一般而言在使用 Redis 进行存储的时候我们需要从以下几个方面来考虑
业务数据常用吗命中率如何如果命中率很低就没有必要写入缓存该业务数据是读操作多还是写操作多如果写操作多频繁需要写入数据库也没有必要使用缓存业务数据大小如何如果要存储几百兆字节的文件会给缓存带来很大的压力这样也没有必要。
在考虑了这些问题之后如果觉得有必要使用缓存那么就使用它
使用 Redis 作为缓存的读取逻辑如下图所示 从上图我们可以知道以下两点
当第一次读取数据的时候读取 Redis 的数据就会失败此时就会触发程序读取数据库把数据读取出来并且写入 Redis 中当第二次以及以后需要读取数据时就会直接读取 Redis读到数据后就结束了流程这样速度就大大提高了。
从上面的分析可以知道读操作的可能性是远大于写操作的所以使用 Redis 来处理日常中需要经常读取的数据速度提升是显而易见的同时也降低了对数据库的依赖使得数据库的压力大大减少。
使用 Redis 作为缓存的写入逻辑如下图所示 从流程可以看出更新或者写入的操作需要多个 Redis 的操作如果业务数据写次数远大于读次数那么就没有必要使用 Redis。
3、高速读/写的场合
在如今的互联网中越来越多的存在高并发的情况比如天猫双11、抢红包、抢演唱会门票等这些场合都是在某一个瞬间或者是某一个短暂的时刻有成千上万的请求到达服务器如果单纯的使用数据库来进行处理就算不崩也会很慢的轻则造成用户体验极差用户量流失重则数据库瘫痪服务宕机而这样的场合都是不允许的
所以我们需要使用 Redis 来应对这样的高并发需求的场合我们先来看看一次请求操作的流程图 我们来进一步阐述这个过程
当一个请求到达服务器时只是把业务数据在 Redis 上进行读写而没有对数据库进行任何的操作这样就能大大提高读写的速度从而满足高速响应的需求但是这些缓存的数据仍然需要持久化也就是存入数据库之中所以在一个请求操作完 Redis 的读/写之后会去判断该高速读/写的业务是否结束这个判断通常会在秒杀商品为0红包金额为 0 时成立如果不成立则不会操作数据库如果成立则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库从而完成持久化的工作。 三、Redis 安装
1、Windows 下安装 官方没有 Windows版本的 Redis Windows版本下载地址https://github.com/MicrosoftArchive/redis/releases下载 Redis-x64-3.2.100.msi 双击刚下载好的msi格式的安装包Redis-x64-3.2.100.msi 开始安装 选择“同意协议”点击下一步继续 选择“添加Redis目录到环境变量PATH中”这样方便系统自动识别Redis执行文件在哪里 端口号可保持默认的6379并选择防火墙例外从而保证外部可以正常访问Redis服务 设定最大值为100M。作为实验和学习100M足够了 右击“计算机”选择“管理”。在左侧栏中依次找到并点击“计算机管理本地” 服务和应用程序 服务。再在右侧找到Redis名称的服务查看启动情况。如未启动则手动启动之。正常情况下服务应该正常启动并运行了 最后来测试一下 Redis 是否正常提供服务。进入 Redis 的目录使用cmd。输入redis-cli并回车。redis-cli是客户端程序如图正常提示进入并显示正确端口号则表示服务已经启动 实际测试一下读写。输入set mykey1 I love you all!并回车用来保存一个键值。再输入get mykey1获取刚才保存的键值
2、Linux 下安装 Redis官网 https://redis.io/ 直接点击下载得到redis-6.2.4.tar.gz 把 redis-6.2.4.tar.gz 移动到/usr/local/ 目录下 : mv redis-6.2.4.tar.gz /usr/local/ 解压 redis-6.2.4.tar.gz : tar -zxvf redis-6.2.4.tar.gz 由于redis是由C语言编写的它的运行需要C环境因此我们需要先安装gcc yum install gcc-c 进入到 /usr/local/redis-6.2.4/ 目录下进行编译与安装 cd redis-6.2.4、make 、cd ./src 、 make install Redis不是默认后台启动的需要求改一下配置文件vi redis.conf 将 daemonize 属性改为 yes 编辑 redis.conf配置文件开启redis远程访问服务 配置文件中的 bind 127.0.0.1 这一行给注释掉这里的bind指的是只有指定的网段才能远程访问这个redis注释掉后就没有这个限制了配置文件中的 protected-mode 设置成 no默认是设置成yes的 防止了远程访问在redis3.2.3版本后 启动redis服务 redis-server redis.conf 启动redis客户端服务redis-cli -p 6379 打开RedisDesktopManager测试服务是否开启 以及 是否可以远程访问Redis\
3、Mac 下安装使用Homebrew
没有安装Homebrew首先安装npm国内的吧快一些/bin/zsh -c $(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh);使用Homebrew安装命令brew install redis查看安装及配置文件位置 Homebrew安装的软件会默认在/usr/local/Cellar/路径下redis的配置文件redis.conf存放在/usr/local/etc路径下 启动redis服务redis-server /usr/local/etc/redis.conf 或 brew services start redis 或 redis-server查看redis服务进程ps axu | grep redisredis-cli连接redis服务redis默认端口号6379默认auth为空redis-cli -h 127.0.0.1 -p 6379