zoukankan      html  css  js  c++  java
  • 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连接池的形式.性能更好,更加适用于企业开发.

  • 相关阅读:
    情报类资源整合
    运营商查询
    Mybatis 示例之 SelectKey
    TortoiseSVN的bin目录下面没有svn.exe
    IntelliJ IDEA 的SVN配置与使用
    Win10安装.net framework 4.0失败提示已是操作系统一部分如何解决
    eclipse中 properties文件编码问题
    springMVC注解@initbinder日期类型的属性自动转换
    2013
    java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)
  • 原文地址:https://www.cnblogs.com/xiangyuqi/p/8651964.html
Copyright © 2011-2022 走看看