09、redis安装入门

课程补充

1.1 网络的知识

1.1.1 虚拟机和window的连接

 

说明:虚拟机的nat模式依赖于net8网卡,nat8网卡的地址是一个网关,window系统中.window系统访问Linux系统必须经过nat8网卡.否则不能通信

1.1.2 虚拟化关闭

 

说明:该报错信息是由于计算机关闭了虚拟化设置.需要进入bios系统中开启即可F10保存退出.

1.1.3 数据库链接长时间链接不上

说明:1.关闭防火墙

     2.开放mysql对外的访问权限

 3.ping 主机IP地址是否成功

 4.nat8网卡重启

 5.安装mysql开始

 6.保证mysql数据的一致性

Redis

2.1 Redis介绍

2.1.1 分析

说明:数据库中虽然实现了主从复制和读写分离.在一定程度上能够抗击高并发,但是性能并不是特别的完善.现在所面临的主要问题是用户大量的读的操作所引发的高并发的问题?

如何处理:缓存机制

 

2.1.2 缓存机制

说明:缓存机制是降低了客户端访问服务器的访问频次.并且缓存中的数据是与服务器(数据库)中的数据是同步的.

2.1.3 引入缓存引发的问题

1.缓存的数据如何存储??

2.缓存中的数据如何持久化??

3.缓存中的数据如何实现数据同步??

4.缓存中的数据内存如何维护

2.1.4 解决方案

1.缓存中的数据可以使用Map存储,

因为map的数据结构是key:value. key不允许重复

2.定时将缓存中的数据保存到磁盘文件中.当服务器宕机,先应该读取磁盘持久化文件,恢复缓存的数据.

3.当数据发生”更新”操作时,及时的维护缓存的数据(拦截器/监听器/AOP)

4.设定最大的内存,当内存超过阈值时,采用lru算法删除最近最少使用的数据

 

2.1.5 Redis介绍

说明:redis是现阶段使用量较多的缓存数据库.能够支持300000/秒集合运算.因为底层是基于c语言开发的.

2.1.6 Redis下载

  

2.2 安装redis

2.2.1 引入jar

 

2.2.2 编译redis

 

 

说明:如果出现上述文件表示编译成功

  1. redis-server 表示启动redis

  2. redis-cli    连接redis的客户端

  3. redis-check-rdb 检测数据持久化文件 rdb

  4. redis-check-aof 检测redis持久化文件aof

2.2.3 安装redis

 

说明:如果出现上图的提示,表示redis安装成功

2.2.4 Redis启动

说明:启动的命令 redis-server

2.2.5 开启redis的后台启动

  1. 编辑配置文件

vim redis.conf

  1. 取消IP绑定

 

  1. 关闭保护模式

 

4.开启后台启动

 

  1. 启动测试

redis-server redis.conf

 

5.关闭redis

Kill -9 9249

redis-cli shutdown

 

 

2.2.6 Redis客户端测试

命令:redis-cli 进入客户端

 

2.2.7 Redis命令

说明:学习redis命令

指令

说明

案例

set

设定key的值

set name tom

get

获取指定 key 的值

get name

strlen

获取key值的长度

strlen name

exists

检查给定 key 是否存在

exists name 返回1存在  0不存在

del

删除指定的key/key1 key2

del name1 name2

keys

命令用于查找所有符合给定模式 pattern 的 key

Keys * 查询全部的key值

Keys n?me 占位符

Keys name* 以name开头的key

mset

赋值多个key-value

mset key1 value1 key2 value2 key3 value3

同时赋值多个值

mget

获取多个key

Mget key1 key2 key3

append

对指定的key进行追加

append key 123456   value123456

append key " 123456" value 123456中间多一个空格

Type

查看key的类型

Type key1  

127.0.0.1:6379> TYPE key1string

Flushdb

清空当前数据库

Flushdb 清空数据库

Select

切换数据库

Select 0-15 redis一共有16个数据库

FLUSHALL

清空全部数据库数据

flushall

Incr

自动增长1

Incr num  数据会自动加1

Incr string 数据库会报错

Decr

自动减1

Decr name 数据会自动减1

incrby

指定步长自增

Incrby 2 每次自增2

Decrby

指定步长自减

Decrby 2每次减2

Expire

指定key的失效时间单位是秒(s)

EXPIRE name1 5   5秒后数据失效

Ttl

查看key的剩余存活时间

Ttl name

-2表示失效

-1没有失效时间

Pexpire

设置失效时间(毫秒)

Pexpire name 1000 用于秒杀业务

Persist

撤销失效时间

撤销失效时间

2.3 Redis入门案例

2.3.1 引入jar包文件

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.4.1.RELEASE</version>
</dependency>

<jedis.version>2.6.2</jedis.version>
<!-- jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${jedis.version}</version>
</dependency>

2.3.2 入门案例

/**
     * 1.连接远程redis的客户端 ip:6379
     * 2.通过jedis操作数据的增和删
     */
    @Test
    public void test01(){
        Jedis jedis = new Jedis("192.168.126.142", 6379);
        jedis.set("name", "jerry");
        System.out.println("获取redis中的数据:"+jedis.get("name"));
    }

2.4 Spring管理jedis

2.4.1 编辑配置文件

<!--Spring管理Jedis  
        name= "构造参数的名称"
        index="构造参数的位置"
        总结:构造注入时使用index不用name.原因由于java只会维护形参的数据类型
        不会维护形参的名称.所有通过name属性进行构造注入时,可能会产生风险.
        所以建议使用index.
        
        addUser(int age,String sex)
        addUser(int arg0,String arg1) 由于没有导入源码
        
        关于type类型的说明:
        一般情况下,SPring会自动的维护参数类型,所以可以省略不写.
        但是如果类中的构造方法重载较多,出现参数个数相同的情况,
        需要指定参数类型.Spring根据特定的参数实现构造注入.
    -->
    <bean id="jedis" class="redis.clients.jedis.Jedis">
        <constructor-arg index="0" value="${redis.host}" 
        type="java.lang.String"/>
        <constructor-arg index="1" value="${redis.port}" 
        type="int"/>
    </bean>

2.4.2 引入redis的配置文件

1.编辑redis.properties

 

 2.交给Spring容器管理

 

 

2.5 Redis缓存实例

2.5.1 使用缓存的要求

说明:将变化不大的数据添加到缓存中.

省市县区,部门名称/信息/商品的分类目录

2.5.2 商品分类目录实现缓存

说明:商品分类目录使用redis缓存实现

规定:

  1. key值使用parentId
  2. value值使用List集合的JSON

  步骤:

1.当用户查询数据时,先查询缓存

2.当缓存中没有数据,应该查询后台的数据库

3.将查询的结果转化为JSON,存入redis

4.当用户再次查询时,缓存中已经含有该数据

5.redis中的JSON串转化为List集合

6.list集合返回

 

2.5.3 编辑Controller

 

 

2.5.4 编辑Service

/**
     * 1.当用户查询数据时,先查询缓存
       2.当缓存中没有数据,应该查询后台的数据库
       3.将查询的结果转化为JSON串,存入redis中
       4.当用户再次查询时,缓存中已经含有该数据
       5.将redis中的JSON串转化为List集合
       6.将list集合返回
     */
    @Override
    public List<ItemCat> findItemCatByParentId(Long parentId) {
        //创建List集合
        List<ItemCat> itemCatList = new ArrayList<ItemCat>();
        
        //定义key 定义前缀保证key不重复
        String key = "ITEM_CAT_"+parentId;
        
        //从缓存中获取数据
        String jsonData = jedis.get(key);
        
        try {
            //判断返回值是否为空
            if(StringUtils.isEmpty(jsonData)){
                //表示没有缓存 查询数据库
                ItemCat itemCat = new ItemCat();
                itemCat.setParentId(parentId);
                itemCat.setStatus(1); //正常的分类信息
                
                itemCatList = itemCatMapper.select(itemCat);
                
                //将itemcatList集合转化为JSON串
                String resultJSON = 
                        objectMapper.writeValueAsString(itemCatList);
                
                //将数据存入redis缓存中
                jedis.set(key, resultJSON);
            }else{
                //表示redis中含有数据,将JSON数据转化为List集合
                ItemCat[] itemCats = 
                        objectMapper.readValue(jsonData,ItemCat[].class);
                
                //将返回值转化为List集合
                itemCatList = Arrays.asList(itemCats);
            }
        
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return itemCatList;

    }    
View Code

2.5.5 编辑pojo

 

说明:如果不添加上述的注解则会报错

 

说明:由于将JSON数据转化为对象时,需要调用其中的setXXX()方法.但是statetext属性是树形结构展现数据时的要求和实际的业务没有关系.所以添加@JsonIgnoreProperties(ignoreUnknown=true)表示忽略未知字段.最终实现对象的转化.

2.5.6 速度测试

  1. 使用redis缓存前

没有使用redis缓存前耗时400毫秒

  1. 使用redis缓存后

 

速度明显提升

2.5.7 修改

1.修改数据文件

2.修改nginx配置文件

2.6 Redis单台高级编辑

2.6.1 定义配置文件

<!--通过线程池的方式整合单台redis  -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--定义连接的总数  -->
        <property name="maxTotal" value="${redis.maxTotal}"/>
        
        <!--定义最大的空闲数量  -->
        <property name="maxIdle" value="${redis.maxIdle}"/>
        
        <!--定义最小空闲数量  -->
        <property name="minIdle" value="${redis.minIdle}"></property>
    </bean>
    
    
    <!--通过工厂模式创建jedis连接 
        需要指定 host主机 和端口号
        引用连接池配置
     -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        
        <!--引入线程池的配置  -->
        <property name="poolConfig" ref="poolConfig"/>
    </bean>
    
    <!--配置SpringJedisTemplate spring操作redis的模板工具API  -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <!--配置redis工厂  -->
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
    </bean>
View Code

2.6.2 引入redis.properties文件

redis.host=192.168.126.142

redis.port=6379

redis.maxTotal=1000

redis.maxIdle=30

redis.minIdle=10

2.6.3 编辑工具类

@Service
public class RedisService {
    
    @Autowired    //注入spring的模板工具
    private StringRedisTemplate redisTemplate;
    
    
    public void set(String key,String value){
        ValueOperations<String, String> operations = 
                redisTemplate.opsForValue();
        //将数据写入redis中
        operations.set(key, value);
    }
    
    //通过key获取数据
    public String get(String key){
        ValueOperations<String, String> operations = 
                redisTemplate.opsForValue();
        return operations.get(key);
    }    
}
View Code

说明:jt-common编辑完成之后需要重新进行打包,否则业务层调用不生效

2.6.4 编辑service

说明:将原有单个jedis的操作改为jedis连接池的形式.性能更好,更加适用于企业开发.

原文地址:https://www.cnblogs.com/xiangyuqi/p/8651964.html