共计 3944 个字符,预计需要花费 10 分钟才能阅读完成。
缓存机制
阐明:应用缓存能够无效的升高用户拜访物理设施的频次,疾速从内存中后去数据,之后返回给用户须要保障内存中的数据就是数据库数据。
1. 缓存的运行环境应该在内存中(快)。
2. 应用 C 语言开发缓存。
3. 缓存的数据结构【K——V 构造,个别采纳 String 类型多,hey 必须惟一,v:Json 格局】。
4. 内存环境断电即擦除,所以应该将内存数据长久化(执行写盘操作)。
5. 如果没有保护内存的大小,则容易导致内存溢出,所以采纳 LRU 算法优化!
Redis 介绍
redis 是一个 key-value 存储系统。和 Memcached 相似,它反对存储的 value 类型绝对更多,包含 string(字符串)、list(链表)、set(汇合)、zset(sorted set – 有序汇合)和 hash(哈希类型)。这些数据类型都反对 push/pop、add/remove 及取交加并集和差集及更丰盛的操作,而且这些操作都是 原子性 的。在此基础上,redis 反对各种不同形式的排序。与 memcached 一样,为了保障效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把批改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它能够用作数据库、缓存和消息中间件。它反对多种类型的数据结构,如 字符串(strings),散列(hashes),列表(lists),汇合(sets),有序汇合(sorted sets)与范畴查问,bitmaps,hyperloglogs 和 天文空间(geospatial)索引半径查问。Redis 内置了 复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions)和不同级别的 磁盘长久化(persistence),并通过 Redis 哨兵(Sentinel)和主动 分区(Cluster)提供高可用性(high availability)。
原子性阐明:
Redis 的操作是单过程单线程操作,所以没有线程并发性的平安问题,采纳队列的形式一个一个操作。
Redis 常见用法:
1.Redis 能够当做缓存应用。
2.Redis 能够当做数据库应用(验证码 ….)
3.Redis 能够当做消息中间件应用(银行转账 ….)
Redis 的装置
1. 解压 Redis 安装包
[root@localhost src]# tar -zxvf redis-5.0.4.tar.gz
2. 装置 Redis
阐明:在 Redis 的根目录中执行命令
命令:
1.”make”
2.make install
批改 Redis 的配置文件
命令 set nu // 展示行号
批改地位:
~~~~1. 正文 IP 绑定
2. 敞开保护模式
3. 开启后盾启动
Redis 服务器命令
1. 启动命令: redis-server redis.conf
2. 检索命令: ps -ef | grep redis
3. 进入客户端: redis-cli -p 6379(如果默认端口是 6379 则这里的端口号能够省略)
4. 敞开 redis: kill -9 PID 号 | redis-cli -p 6379 shutdown
Redis 入门案例
引入 jar 包文件
<!--spring 整合 redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
编辑测试 API
public class TestRedis {
/**
* 1. 测试 redis 的程序连贯是否失常
* 步骤:* 1. 实例化 jedis 工具 API 对象(host:port)* 2. 依据实例 操作 redis 办法就是命令
*
* 对于链接不通的阐明:
* 1. 查看 Linux 防火墙
* 2. 查看 Redis 配置文件批改项
* 2.1 IP 绑定
* 2.2 保护模式
* 2.3 后盾启动
* 3. 查看 redis 启动形式 redis-server redis.conf
* 4. 查看 IP 端口 及 redis 是否启动...
*/ @Test
public void test01(){
String host="192.168.126.129";
int port=6379;
Jedis jedis=new Jedis(host,port);
jedis.set("2006", "好好学习天天向上");
System.out.println(jedis.get("2006"));
// 练习是否存在 key
if(jedis.exists("2006")){jedis.del("2006");
}else{jedis.set("2006","hdsjiahjds");
jedis.expire("2006", 100);
}
}
setex 的应用
/**
* 需要:* 1. 向 redis 中插入数据
* 2. 为 key 设定超时工夫。,60 秒后生效
* 3. 线程 sleep 3 秒
* 4. 获取 key 的残余的存活工夫
*
*/// 如果用上面这种办法的话会导致出现异常的话上面的代码不执行,所以要满足原子性要求
@Test
public void test02() throws InterruptedException {Jedis jedis=new Jedis("192.168.126.129",6379);
jedis.set("红楼梦", "贾宝玲");
jedis.expire("红楼梦", 60);
Thread.sleep(3000);
System.out.println(jedis.ttl("红楼梦"));
}
/* 如果用 redis 并且须要增加超时工夫时,个别须要满足原子性要求
* 原子性:操作时要么胜利要么失败,然而必须同时实现
* 用 setex 实现 redis 的增加,setex 保证数据的原子性操作
* */
@Test
public void test03() throws InterruptedException {Jedis jedis=new Jedis("192.168.126.129",6379);
jedis.setex("红楼梦",60, "林黛玉");
System.out.println(jedis.get("红楼梦"));
}
setnx 的应用
/**
* 判断数据是否曾经存在,如果曾经存在则不批改,如果不存在则增加
*
* 之前用 if 判断语句来判断数据是否曾经存在,* 在这里用 setnx 判断数据是否曾经存在
* */
@Test
public void test04() throws InterruptedException {Jedis jedis=new Jedis("192.168.126.129",6379);
/*if(jedis.exists("aa")){System.out.println("key 曾经存在,不批改");
}else{jedis.set("aa", "测试数据");
}*/ jedis.setnx("aaa", "数据是否存在");
System.out.println(jedis.get("aaa"));
}
set 超时工夫原子性操作
/**
* 需要:* 1. 要求用户赋值时,如果数据存在则不赋值。setnx
* 2. 要求在赋值操作时,必须设定超时的工夫,并且要求满足原子性 setex
* * 如果同时要满足这两个要求的话则不能用 setnx 和 setex。因为这两个办法在独自
* 执行时是能够的,然而放在一块一起执行的话则会出错。* 所以这里要用 set 办法,外面的 params 则是示意设置一个 set 对象。* SetParams 中的参数:* nx:当数据不存在的时候才会赋值
* xx: 当数据存在的时候才会赋值
* ex:示意生效的工夫,单位是秒
* px:也示意生效的工夫,单位是毫秒
*/
@Test
public void test05(){Jedis jedis=new Jedis("192.168.126.129",6379);
SetParams setParams=new SetParams();
setParams.nx().ex(60);// 加锁的操作
jedis.set("bbb", "实现业务操作 ccc", setParams);
System.out.println(jedis.get("bbb")+jedis.ttl("bbb"));
jedis.del("bbb");// 解锁的操作
}
List 汇合的练习
@Test
public void testList() throws InterruptedException {Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.lpush("list", "1","2","3");
System.out.println(jedis.rpop("list"));
}
redis 事务管制
@Test
public void testTx() throws InterruptedException {Jedis jedis = new Jedis("192.168.126.129", 6379);
//1. 开启事务
Transaction transaction = jedis.multi();
try {transaction.set("aa", "aa");
// 提交事务
transaction.exec();}catch (Exception e){e.printStackTrace();
// 回滚事务
transaction.discard();}
}