淘先锋技术网

首页 1 2 3 4 5 6 7

一.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();
			}
		}
	}