Redis缓存

系统优化策略:

作用:引入缓存机制可以有效的降低用户访问物理设备的频次,从而提高响应速度.
image.png

如何设计缓存

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绑定
image.png
b.修改保护模式
image.png
c.开启后台启动
image.png

Redis服务器命令

注意:Redis服务运行时,必须依赖于配置文件redis.conf.操作redis时最好在根目录中操作.
1)启动redis
redis-server redis.conf
image.png

2)进入redis客户端
redis-cli -p 6379 (9379是缓存服务器默认的端口号)
如果是本机服务也可以写成 redis-cli
ctrl+c退出客户端
image.png

3)关闭redis服务器
查出进程:ps -ef | grep redis
终结进程:kill -9 XXXX kill XXXX
image.png

也可以直接用 redis-cli -p 6379 shutdown指令关闭服务器

Redis命令

String 类型

image.png

Hash类型

image.png

List类型

说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向出入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
image.png
image.png

Redis事务命令

说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.
image.png

Redis高级应用

redis入门案列

1、添加jar包文件
image.png

2、String数据结构案例
image.png
image.png

3、hash数据结构案例
image.png
结果展现:
image.png

4、List数据结构案列
image.png
结果展现
image.png

测试基本命令

image.png

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();
    }
}


Jame
13 声望1 粉丝

专注技术开发、自动化办公脚本、数据处理、数据爬取...Wecat:W13611455764