超强Redis一篇入门

点赞多大胆,就有多大产路漫漫其修远兮,吾将上下而求索,献给每一位技术使用者和爱好者!

干货满满,摆好姿势,点赞发车

Redis系列目录

最近工作要讲到Redis,之前也推出了Redis的文章,现在对Redis系列文章重新编排整理升级(损失了好多积分),本Redis系列后期还会持续更新内容,大家可持续关注,希望可以帮到Redis爱好者和使用者,干货满满,我们出发吧!

《Redis一篇入门》

《Redis常用API命令整理》

《最新超详细注释解析SpringBoot2.X操作Redis5.X》

《Redis 主从复制 高可用和分布式基石》

《一气呵成Redis Sentinel从配置到编码实现Redis高可用故障转移》

《Redis Cluster 集群模式从零理论 加 集群搭建》

《Redis Cluster集群 升级 集群伸缩和SpringBoot操作Redis 集群》


 

初识Redis

什么是Redis

完全开源免费,使用C语言编写,遵守BSD协议的一个高性能key-value分布式内存数据库并提供持久化的NoSQL数据库。Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),可用作数据库缓存消息中间件。

Redis特性

速度快

Redis官方给出的数据是10W QPS(每秒可以操作数据10W次),这个数据会根据电脑性能和Redis的使用方式不同而略微不同,但是在万级数据中操作没有压力。

那么Redis为什么这么快,主要有以下几个方面

1、纯内存操作

数据存放在内存中,内存的响应时间大约是 100纳秒 ,这是Redis每秒万亿级别访问的重要基础。

2、编程语言

纯ANSI C编写,不依赖第三方类库,没有像memcached那样使用libevent,因为libevent迎合通用性而造成代码庞大,所以作者用libevent中两个文件修改实现了自己的epoll event loop。

3、线程模型

Redis使用单线程操作,避免了频繁的上下文切换,虽然是采用单线程,但是单线程避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU;虽然作者认为CPU不是瓶颈,内存与网络带宽才是,但实际测试时并非如此。

4、采用了非阻塞I/O多路复用机制

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间

持久化

Redis的数据存储在内存中,对数据的更新会异步存储在磁盘中,Redis提供两种持久化策略保证服务在宕机或者断电等不正常情况发生时,重启Redis服务来恢复数据到内存中。

多种数据结构

Redis提供了string、List、set、Zset、Hash五种数据结构来存储数据,而memcached只支持string数据类型。在redis的新版本中提供了 bitmaps(位图), hyperloglogs (超小内存唯一值计数)和 geospatial(地理空间)数据类型

支持多种编程语言

功能丰富

1、消息发布订阅

2、Lua脚本

3、事务

4、pipeline

简单

Redis单节点的核心代码只有23000行,我们来吃透Redis这个项目,或者有些企业通过修改Redis源代码来实现定制化功能都是非常容易的,Redis不依赖于外部的第三库,单线程模型,无论服务端还是客户端开发都会相对容易。

主从复制

在Redis中有主从复制,分为主服务器从服务器两个角色,主服务器数据可以同步到从服务器上,可以为高可用和分布式提供很好的基础。

高可用和分布式

Redis的单点或者主从复制模型,如果想要实现高可用是比较困难的,在2.8版本推出Redis-Sentinel支持高可用,Redis在3.0版本推出Redis-Cluster支持分布式

Redis典型应用场景

缓存系统

由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这个功能最为常见,我们几乎所有的项目都有所运用

限时业务

redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景

计数器

redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等

排行榜

关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序。在实际运用中性能体验也蛮不错

分布式锁

这个主要利用redis的setnx命令进行,setnx:"set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0 ,如果我们服务器是集群的,定时任务可能在两台机器上都会运行,所以在定时任务中首先 通过setnx设置一个lock,如果成功设置则执行,如果没有成功设置,则表明该定时任务已执行。 当然结合具体业务,我们可以给这个lock加一个过期时间,比如说30分钟执行一次的定时任务,那么这个过期时间设置为小于30分钟的一个时间 就可以,这个与定时任务的周期以及定时任务执行消耗时间相关。我们可以将这个特性运用于其他需要分布式锁的场景中,结合过期时间主要是防止死锁的出现。zookeeper也可以来实现分布式锁

延时操作

比如在订单生产后我们占用了库存,10分钟后去检验用户是够真正购买,如果没有购买将该单据设置无效,同时还原库存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub/Sub频道,以便以某种方式接收影响Redis数据集的事件。 所以我们对于上面的需求就可以用以下解决方案,我们在订单生产时,设置一个key,同时设置10分钟后过期, 我们在后台实现一个监听器,监听key的失效,监听到key失效时将后续逻辑加上。 当然我们也可以利用rabbitmq、activemq等消息中间件的延迟队列服务实现该需求

点赞、好友等相互关系的存储

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。 又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能

队列

由于redis有list push和list pop这样的命令,所以能够很方便的执行队列操作,如果你要实现复杂的队列使用RabbitMQ等专业队列中间件

Redis的使用场景还有很多很多这里就不一一列举额,大家掌握Redis的特性在工作中可以灵活运用即可

Redis安装和配置

Redis安装环境

Redis可以在windows下和Unix下安装,我们这里选择使用Linux下安装,也是推荐的一种方式

下载

我们进入到/usr/local目录下下载安装包,或者到官网下载之后上传到Linux上。下载地址:http://download.redis.io/releases/

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

解压安装

解压

tar -zxvf redis-5.0.5.tar.gz

安装

进入到redis解压目录运行make & make install进行编译安装

make & make install

Redis核心文件目录介绍

src目录

Redis的核心目录是src目录,在Redis的安装目录下,Redis的相关启动关闭命令就在该目录下

redis-server------------>操作Redis服务器命令

redis-cli----------------->Redis命令行客户端

redis-benchmark----->Redis性能检测工具

redis-check-aof------->AOF文件修复工具

redis-check-rdb---->RDB文件检查工具

redis-sentinel---------->Sentinel服务器(2.8以后版本)

我们目前需要关心的是redis-server和redis-cli这两个命令

redis.conf文件

redis.conf配置文件在redis的安装目录下,这个是redis的核心配置文件,如果我们要修改配置可以读取该文件,默认读取redis安装目录下的这个配置文件,我们在启动Redis时也可以指定配置文件读取。

动点手脚

我们进入到src目录下之后发现有很多文件,我们需要使用的就是那么几个可执行命令,我们可以在redis安装目录下创建bin目录将可执行文件拷贝进来,方便使用。参考图如下,大家使用cp命令即可实现

redis启动和连接

默认启动

使用默认的配置启动redis,直接使用redis-server命令即可,使用非守护进程的方式启动,会占用当前操作窗口,我们可以之间按ctrl+c退出Redis

redis-server

动态参数

我们可以使用动态参数方式连接redis,我们指定端口号为6380

redis-server --port 6380

指定配置文件(推荐使用)

1、在redis安装目录下创建conf目录存储配置文件

mkdir conf

2、将redis.conf配置文件中的内容去除注释和空格等输出到指定配置文件(redis-6379.conf)中

cat redis.conf | grep -v "#" | grep -v "^$" >> conf/redis-6379.conf

3、修改redis-6379.conf文件,大家修改时注意注释的地方即可

#bind 127.0.0.1
protected-mode no
port 6379
daemonize yes
logfile "/var/redis-5.0.5/logs/redis.log"
dir "/var/redis-5.0.5/data"

4、创建data和logs目录

mkdir -p /var/redis-5.0.5/data /var/redis-5.0.5/logs

5、启动,redis-server后跟上配置文件路径即可

redis-server conf/redis-6379.conf

6、查看redis进程

ps -ef | grep redis

客户端连接

我们这里使用命令行客户端连接redis,使用redis-cli命令 -h写ip,-p写端口

redis-cli -h 127.0.0.1 -p 6379

测试使用

ping命令如果返回PONG代表连接成功

set 设置String类型值,k1、为键,hello为值

get 根据键获取值,k1为键,hello为返回的值

Redis常用配置

Redis的配置有很多,这里我们是简单入门说一些常用的配置,其他的配置我们在指定的模块贴出,这些配置都是在我们上边说到的redis.conf文件中

daemonize

大概在136行,默认为no,是否将redis进程当做守护进程在后台运行,我们可以将其设置为yes

port

大概在92行,redis的默认端口为6379,如果需要单节点上启动多个redis实例,需要修改端口号

logfile

大概在171行,配置redis的日志文件,默认什么都没有,我们可以修改日志想要存储的路径等,查看redis运行的情况

dir

大概在263行,配置redis的持久化文件存储路径,默认是./也就是当前路径,也就是启动redis-server命令的路径,可以按需修改

bind

大概在69行,是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址。如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求,我这里直接将其注释掉

protected-mode

大概在88行,redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:

1、关闭protected-mode模式,此时外部网络可以直接访问

2、开启protected-mode保护模式,需配置bind ip或者设置访问密码

 

我是不夜学长,用你勤劳的双手点个赞吧,这将是我创作更多优质文章的动力!

 

  • 33
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
如果你想在Java中使用Redis,需要引入Redis的Java客户端库。目前比较常用的Java客户端库有Jedis和Lettuce。 首先,你需要在Maven或Gradle中添加对Jedis或Lettuce库的依赖: Maven: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency> ``` Gradle: ```groovy implementation 'redis.clients:jedis:3.7.0' ``` 接下来,你需要创建一个Redis客户端对象,连接到Redis服务器: 使用Jedis: ```java Jedis jedis = new Jedis("localhost", 6379); ``` 使用Lettuce: ```java RedisClient client = RedisClient.create("redis://localhost:6379/0"); StatefulRedisConnection<String, String> connection = client.connect(); RedisCommands<String, String> syncCommands = connection.sync(); ``` 这里的`localhost`是Redis服务器的地址,`6379`是Redis服务器的端口号。 连接成功后,你可以使用Redis命令对Redis中的数据进行操作。例如,以下是使用Jedis向Redis中存储一个字符串的示例: ```java jedis.set("mykey", "myvalue"); ``` 使用Lettuce: ```java syncCommands.set("mykey", "myvalue"); ``` 这里的`mykey`是键(key),`myvalue`是值(value)。 接下来你可以使用`get`命令来获取这个键所对应的值: 使用Jedis: ```java String value = jedis.get("mykey"); ``` 使用Lettuce: ```java String value = syncCommands.get("mykey"); ``` 这里的`value`变量将会得到`myvalue`这个值。 除了基本的字符串类型,Redis还支持更多的数据结构,如列表、散列、集合、有序集合等。你可以参考Redis官网提供的文档来了解更多的Redis命令和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石添的编程哲学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值