Redis基础

一、Java缓存机制

什么是Jvm内置缓存?
答:值存放在jvm缓存中。

mybatis、hibernate二级缓存机制,是sessionFactory级别。
什么是noql缓存?
答:

相同点:都是存放在内存中。

mybatis二级缓存机制默认使用的是oscache
hibernate二级缓存机制默认使用的是ehcache

oscache与ehcache 
: 属于jvm内置缓存
oscache:主要针对的是数据库访问层
ehcache:主要针对的是jsp页面缓存。

与session类似,就是加了一个static关键字,存放在服务器内存上

java 中的 一级 二级 三级 缓存_缓存

JVM缓存有什么缺点:
    会产生内存溢出,没有持久化机制。在分布式情况下会产生线程安全、
    多服务器不能共享。

解决:使用NOSQL非关系型数据库:
    redis、mogodb、hbase、memcacha

二、使用java操作Ehcache

缓存流程  提高查询效率

java 中的 一级 二级 三级 缓存_redis_02

ehcache缓存支持:使用springBoot项目演示。


第一步:导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
第二步:建立ehcache.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    updateCheck="false">
    <diskStore path="java.io.tmpdir/Tmp_EhCache" />

    <!-- 默认配置 -->
    <defaultCache maxElementsInMemory="5000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120"
        memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />

    <cache name="baseCache" maxElementsInMemory="10000"
        maxElementsOnDisk="100000" />

</ehcache>
第三步:@CacheConfig(cacheManager="baseCache")
       @Cacheable  加在查询语句上 ,插入不需要加什么缓存的
加在dao层如图:

java 中的 一级 二级 三级 缓存_缓存_03

@EnableCaching  缓存开启注解  加在App.java上

三、nosql数据库简介

什么是nosql?非关系型数据库
关系型数据库:mysql orcal sqlserver
    特征:持久、主外键、sql语句、存放在硬盘上
非关系型数据库:缓存数据库、值存放在内存中。---- java内置缓存
redis:必须学会:基本数据类型、redis持久化、redis高可用。
mongdb:主要存储json格式
membase:
hbase:
特征:存储在内存中、key-value存放,分布式情况下服务器数据共享。
效率非常高。
缺点:数据容易丢失(不用担心、因为有数据备份、持久化)
redis高可用:数据备份、持久化。宕机方案。

redis:主从复制、读写分离、哨兵机制、集群

四、redis

什么是redis?
    redis是nosql缓存数据库
为什么要用redis?
    使用redis能够减去数据库访问压力

缓存流程:

java 中的 一级 二级 三级 缓存_缓存_04

总结:redis作用就是减轻数据库访问压力,
     因为查询内存比查询数据库效率高。

redis的应用:1、token生成、session共享。分布式锁、自增id 验证码
redis可以设置有效期。
本身开源
重要:
redis基本数据类型:string、set、zset、has、list

五、redis安装windows

java 中的 一级 二级 三级 缓存_java_05

start.bat文件:
redis-server.exe  redis.windows.conf

java 中的 一级 二级 三级 缓存_java_06

客户端连接,默认有16个数据库

redis修改密码:

java 中的 一级 二级 三级 缓存_java_07

修改密码时前面不要加空格

六、linux环境安装redis

首先进入linux环境,进入到usr目录下,创建个redis目录。

java 中的 一级 二级 三级 缓存_java_08

上传安装包到linux

java 中的 一级 二级 三级 缓存_redis_09

解压文件夹:
tar -zxf redis-3.0.0.tar.gz
进入解压后的目录
make 编译
再进入到编译后的src文件夹
make install
这样就完成安装了。
然后再进入usr/local下面新建redis文件夹
cd /usr/local
mkdir -p /usr/local/redis/bin    
mkdir -p /usr/local/redis/etc
再讲刚刚的redis文件复制到这两个文件夹下
cp redis.conf /usr/local/redis/etc  //复制文件到
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-sentinel /usr/local/redis/bin
这样进入local下面的redis文件下的bin目录。
启动redis命令:  ./redis-server  这样启动是前台方式启动的。

这样再关闭防火墙,才能使用电脑客户端连接上去

关闭防火墙命令:
service iptables stop

修改redis为后台启动方式:

java 中的 一级 二级 三级 缓存_redis_10

修改完成后,再bin目录下,启动命令  后台启动方式
./redis-server /usr/local/redis/etc/redis.conf

可以使用redis命令进行连接
./redis-cli -h 127.0.0.1 -p 6379 -a "123456"

七、redis基本数据类型

String:存放对象使用String来,用json存储
Set: 无序集合,不允许重复
ZSet:能够排序的集合,不允许重复
Hash:可以name
List:这个是list集合

八、java操作redis 使用jedis

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
jedis操作redis:代码:
package com.leeue.redis;

import java.util.HashMap;

import com.sun.javafx.collections.MappingChange.Map;

import redis.clients.jedis.Jedis;

/**
 * @classDesc: 功能描述:(使用jedis操作redis)
 * @author:<a href="leeue@foxmail.com">李月</a>
 * @Version:v1.0
 * @createTime:2018年9月10日 下午1:14:55
 */
public class RedisTest {
    private static Jedis jedis = null;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.184.128",6379);
        jedis.auth("123456");
    //  setString();
    //  setMap();
     // setList();
        // setSet();
         zSet();

    }
    /**
     * 操作string类型
     */
    public static void setString() {
        jedis.set("name", "leeue");
        System.out.println("添加成功");
    }

    public static void setMap() {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("leeue", "2500");
        jedis.hmset("haha", hashMap);
        System.out.println("添加成功....");
    }

    public static void setList() {
        jedis.lpush("leeue", "1");
        jedis.lpush("leeue2", "2");
        System.out.println("添加成功");
    }

    public static void setSet() {
        jedis.sadd("xiaoxiao", "1");
        jedis.sadd("xiaoxiao", "2");
    }

    public static void zSet() {
        jedis.rpush("oop", "oop");
    }
}
redis怎么存放对象?
答:使用string类型的,存放json格式,取用json转换程对象就行了。
[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 6379 -a “123456” 
 127.0.0.1:6379> ping 
 PONG 
 127.0.0.1:6379> set name leeue 
 OK 
 127.0.0.1:6379> set name leeue 
 OK 
 127.0.0.1:6379> set name leeue 
 OK 
 127.0.0.1:6379> lpush listkey redis 
 (integer) 1 
 127.0.0.1:6379> get 1 
 (nil) 
 127.0.0.1:6379> lpush listkey mongdb 
 (integer) 2 
 127.0.0.1:6379> lpush listkey hbase 
 (integer) 3 
 127.0.0.1:6379> lrang list 0 10 
 (error) ERR unknown command ‘lrang’ 
 127.0.0.1:6379> lrange listkey 0 10 
 1) “hbase” 
 2) “mongdb” 
 3) “redis” 
 127.0.0.1:6379>