Redis缓存
系统优化策略:
作用:引入缓存机制可以有效的降低用户访问物理设备的频次,从而提高响应速度.
如何设计缓存
1)缓存数据如何存储?应该采用什么样的数据结构呢?K-V key的唯一性
2)缓存数据的容量大小应该动态维护缓存数据.将不需要的数据提前删除.LRU算法/LFU算法/随机算法/TTL算法.
3)缓存数据保存到内存中,但是内存的特点断电即擦除.定期将内存数据持久化(写入磁盘中).
4)单台缓存服务器性能不足,所以一般需要搭建集群(实现高可用).
5)使用C语言开发(nginx也是C开发).
Redis缓存服务
什么是Redis?
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)。
支持那几种数据结构?
字符串(string)、散列(hsahes)、列表(lists)、集合(sets)、有序集合(sorted sets).
Redis读写速度:读11.2万/秒 写:8.6万/秒
安装Redis(www.redis.cn 有中文网)
1)在Redis根目录下执行命令
2)安装 make
3) 启动make install
安装后需要修改配置文件:
4)修改redis根目录下的redis.conf文件
a.去除IP绑定
b.修改保护模式
c.开启后台启动
Redis服务器命令
注意:Redis服务运行时,必须依赖于配置文件redis.conf.操作redis时最好在根目录中操作.
1)启动redis
redis-server redis.conf
2)进入redis客户端
redis-cli -p 6379 (9379是缓存服务器默认的端口号)
如果是本机服务也可以写成 redis-cli
ctrl+c退出客户端
3)关闭redis服务器
查出进程:ps -ef | grep redis
终结进程:kill -9 XXXX kill XXXX
也可以直接用 redis-cli -p 6379 shutdown指令关闭服务器
Redis命令
String 类型
Hash类型
List类型
说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向出入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
Redis事务命令
说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.
Redis高级应用
redis入门案列
1、添加jar包文件
2、String数据结构案例
3、hash数据结构案例
结果展现:
4、List数据结构案列
结果展现
测试基本命令
setNx/setEx/set命令
/**
* 需求: 如果数据不存在,则将数据修改
*/
@Test
public void testSetNx(){
Jedis jedis = new Jedis("192.168.126.129",6379);
jedis.set("key1", "aaa");
//如果key不存在,则赋值
jedis.setnx("key1", "测试方法");
System.out.println(jedis.get("key1"));
}
/**
* 需求: 实现超时时间的设定与赋值操作的原子性.
* 考点: 为数据设定超时时间时,切记满足原子性要求.
* 否则会出现key永远不能删除的现象
*/
@Test
public void testSetEx(){
Jedis jedis = new Jedis("192.168.126.129",6379);
/*jedis.set("key2", "bbb");
jedis.expire("key2", 3);*/
//???数据超时之后一定会被删除吗??? 错的
jedis.setex("key2", 10, "bbb");
}
/**
* 需求: 如果数据存在时,才会修改数据,并且为数据添加超时时间10秒(原子性).
* 参数说明:
* NX: 只有数据不存在时,才会赋值.
* XX: 只有数据存在时,才会赋值.
* EX: 秒
* PX: 毫秒
*/
public void testSet(){
Jedis jedis = new Jedis("192.168.126.129",6379);
/* if(jedis.exists("key3")){
jedis.setex("key3",10 ,"ccc");
}*/
SetParams setParams = new SetParams();
setParams.xx().ex(10);
//将所有的操作采用原子性的方式进行控制
jedis.set("key3", "ccc", setParams);
}
测试hash
/**
* HASH测试
*/
@Test
public void testHash(){
Jedis jedis = new Jedis("192.168.126.129",6379);
jedis.hset("person", "id", "100");
jedis.hset("person", "name", "tomcat猫");
System.out.println(jedis.hgetAll("person"));
}
测试List
/**
* LIST集合测试
*/
@Test
public void testList(){
Jedis jedis = new Jedis("192.168.126.129",6379);
jedis.lpush("list", "1","2","3","4");
String value = jedis.rpop("list");
System.out.println(value);
}
测试事务
/**
* Set集合测试
* 1. sadd 新增元素
* 2. SCARD 获取元素数量
* 3. SINTER key1 key2 获取元素的交集
* 4. SMEMBERS set 获取集合元素
* demo自己补一下
* * */
@Test
public void testMulti(){
Jedis jedis = new Jedis("192.168.126.129",6379);
//开启事务
Transaction transaction = jedis.multi();
try {
transaction.set("a", "a");
transaction.set("b", "b");
//提交事务
transaction.exec();
}catch (Exception e){
//回滚事务
transaction.discard();
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。