缓存机制
阐明:应用缓存能够无效的升高用户拜访物理设施的频次,疾速从内存中后去数据,之后返回给用户须要保障内存中的数据就是数据库数据。
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的残余的存活工夫 * */// 如果用上面这种办法的话会导致出现异常的话上面的代码不执行,所以要满足原子性要求@Testpublic 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保证数据的原子性操作* */@Testpublic void test03() throws InterruptedException { Jedis jedis=new Jedis("192.168.126.129",6379); jedis.setex("红楼梦",60, "林黛玉"); System.out.println(jedis.get("红楼梦"));}
setnx的应用
/** * 判断数据是否曾经存在,如果曾经存在则不批改,如果不存在则增加 * * 之前用if判断语句来判断数据是否曾经存在, * 在这里用setnx判断数据是否曾经存在 * */@Testpublic 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:也示意生效的工夫,单位是毫秒 */@Testpublic 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(); } }