Redis基础
一.Redis介绍
1.1什么是Redis?
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值对数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值对数据类型如下:
- string(字符串类型)
- list(列表类型)
- hash(哈希)
- set(集合)
- zset(有序集合)
1.2Redis的应用场景
- 缓存(数据查询、短链接、新闻内容、商品内容等等)(最多使用)
- 分布式集群架构中的session分离
- 聊天室的在线好友列表
- 任务队列(秒杀、抢购、12306等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
1.3Redis的特点
- 高效性(内存)
- 原子性(主逻辑线程都是单线程)
- 支持多种数据结构
- 稳定性:持久化,主从复制(集群)
二.Redis安装
1.Windows下Redis安装(了解)
具体可以看我之前的博客,里面有详细介绍Windows下Redis的安装
2.Linux下Redis安装(运维)
1.安装依赖
yum install -y cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make tcl
2.需要先安装gcc新版才能编译
cenos7默认的gcc版本小于5.3无法编译
sudo yum -y install centos-release-scl
sudo yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
// 临时生效,退出 shell 或重启会恢复原 gcc 版本
sudo scl enable devtoolset-9 bash
// 永久生效
sudo echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
3.下载最新版本Redis
wget http://download.redis.io/releases/redis-6.0.5.tar.gz
4.解压安装
tar -zxvf redis-6.0.5.tar.gz
cd redis-6.0.5
make
make install
编译文件会复制到/usr/local/bin目录下
5.修改redis.conf文件并复制到etc目录
bind 127.0.0.1 #根据情况是否需要远程访问去掉注释
requirepass 123456 #修改密码
protected-mode no # 关闭protected-mode模式,此时外部网络可以直接访问
sudo mkdir /etc/redis
sudo cp redis.conf /etc/redis/
6.在 /etc/systemd/system新建service文件
sudo vi /etc/systemd/system/redis.service
内容如下:
[Unit]
Description=Redis
After=network.target
[Service]
#Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecReload=/usr/local/bin/redis-server -s reload
ExecStop=/usr/local/bin/redis-server -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注意Type=forking不注释掉 服务无法启动
6.使服务自动运行
sudo systemctl daemon-reload
sudo systemctl enable redis
7.启动服务
sudo systemctl restart redis
sudo systemctl status redis
三.Redis Java API操作
1.创建Maven工程并导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>redisdemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin>
</plugins>
</build>
</project>
2.连接以及关闭Redis客户端
无密码:
@Test
public void testJedisSingle2(){
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name", "bar");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
有密码:
@Test
public void testJedisSingle(){
JedisShardInfo shardInfo=new JedisShardInfo("redis://127.0.0.1:6379/9");
shardInfo.setPassword("123456");
Jedis jedis = new Jedis(shardInfo);
jedis.set("name", "bar");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
9代表节点,redis一共有16个节点,0-15,默认为1
使用连接池
@Test
public void pool(){
JedisPoolConfig config=new JedisPoolConfig();
//最大连接数
config.setMaxTotal(30);
//最大连接
config.setMaxIdle(2);
JedisPool pool=new JedisPool(config,"127.0.0.1",6379,0,"123456");
Jedis jedis = pool.getResource();
jedis.set("name", "bar");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
四.jedis与spring整合
配置spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="127.0.0.1"/>
<constructor-arg name="port" value="6379"/>
</bean>
有密码这样设置:
<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="127.0.0.1"/>
<constructor-arg name="port" value="6379"/>
<constructor-arg name="timeout" value="0"/>
<constructor-arg name="password" value="123456"/>
</bean>
测试代码
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
}
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(jedis != null){
//关闭连接
jedis.close();
}
}
}