JavaWeb自我复习之Redis和Jedis

本文介绍了Redis作为高性能NOSQL数据库的概念、下载安装、数据结构与命令操作,重点讲解了Redis的持久化机制RDB和AOF。同时,文章详细阐述了Java客户端Jedis的使用,包括JedisPool连接池的配置与操作。
摘要由CSDN通过智能技术生成

一、概念

redis是一款高性能的NOSQL系列的非关系型数据库

关系型数据库:(mysql、oracle...)

  • 数据之间有关联关系
  • 数据存储在硬盘的文件上
  • 便宜、快、键值对、扩展方便

非关系型数据库:[NOSQL](redis、hbase...)

  • 数据之间没有关联关系
  • 数据存储在内存中

总结:

关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据

应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)
  • 聊天室的在线好友列表
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒
  • 分布式集群架构中的session分离

二、下载安装

2.1 官网

https://redis.io

2.2 中文网

redis中文官方网站

2.3 解压直接可以使用:

  • redis.windows.conf:配置文件
  • redis-cli.exe:客户端
  • redis-server.exe:服务器端

三、命令操作

3.1 redis的数据结构

  • redis存储的是:key,value格式的数据(键值对),其中key都是字符串,value有5中不同的数据结构
    • value的数据结构有五种
      • 字符串类型  String
      • 哈希类型  hash:map格式
      • 列表类型  list:linkedList格式
      • 集合类型  set:
      • 有序集合类型  sortedset

3.2 字符串类型  String

  • 存储:set key value
  • 获取:get key
  • 删除:del key

3.2 哈希类型  hash

  • 存储:hset key field value
  • 获取:
    • hget key field:获取指定的field对应的值
    • hgetall key:获取所有的field和value
  • 删除:hdel key field

3.4 列表类型  List(允许重复)

可以添加一个元素到列表的头部(左边)或者尾部(右边)

  • 添加:
    • lpush key value:将元素加入列表左边
    • rpush key value:将元素加入列表右边
  • 获取:
    • lrange key start end:范围获取
  • 删除:
    • lpop key:删除列表最左边的元素,并将元素返回
    • rpop key:删除列表最右边的元素,并将元素返回

3.5 集合类型  set(不允许重复)

  • 存储:sadd key value
  • 获取:smembers key:获取set集合中所有元素
  • 删除:srem key value:删除set集合中的某个元素

3.6 有序集合类型  sortedset:不允许重复元素,且元素有序

  • 存储:zadd key score value
  • 获取:zrange key start end
    • 给后面加withscores可以获取到各个值的score
  • 删除:zrem key value

3.7 通用命令

  • keys*:查询所有的键
  • type key:获取键对应的value的类型
  • del key:删除指定的key value

四、持久化操作

4.1 redis是一个内存数据库,当redis服务器重启或者电脑重启后,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中

4.2 redis持久或机制:

4.2.1 RDB:默认方式,不需要进行配置,默认就使用这种机制(对性能的影响比较低,但可能会丢失一些数据)

  • 在一定的间隔时间中,检测key的变化情况,然后去持久化数据

 1.编辑redis.windows.conf文件

  • save 900 1
    • #   after 900 sec (15 min) if at least 1 key changed         
    • 十五分钟之后,如果最少有1个key被改变的话,他就持久化一次
  • save 300 10
    • #   after 300 sec (5 min) if at least 10 keys changed
    • 五分钟之后,如果最少有10个key被改变的话,他就持久化一次
  • save 60 10000
    • #   after 60 sec if at least 10000 keys changed
    • 一分钟之后,如果最少有10000个key被改变的话,他就持久化一次

 2.重新启动redis服务器,并指定配置文件名称

  • D:\Tools\redis-2.8.9>redis-server.exe redis.windows.conf

4.2.2 AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据(对性能的影响比较严重)

 1. 编辑redis.windows.conf文件

  • appendonly no(关闭AOF)---> appendonly yes(开启AOF)
    • # appendfsync always:每一次操作都进行持久化(性能低)
    • appendfsync everysec:没隔一秒进行一次持久化(默认)
    • # appendfsync no:不进行持久化
       

五、使用Java客户端操作redis--->Jedis

5.1 Jedis介绍

  • 一款Java操作redis数据库的工具。

5.2 使用步骤

5.2.1 下载jedis的jar包

5.2.2 使用

@Test
    public void test1(){
        //1.获取连接
        Jedis jedis = new Jedis("localhost",6379);
        //2.操作
        jedis.set("yangge","niubi");
        //3.关闭连接
        jedis.close();
    }

5.2.3 Jedis操作各种redis中的数据结构

  • 字符串类型  String
    • set
    • get
    • del
    • /**
           * String数据结构操作
           */
          @Test
          public void test2(){
              //1.获取连接
              //如果使用空参构造,默认值是"localhost",6379端口
              Jedis jedis = new Jedis("localhost",6379);
              //2.操作
              //存储
              jedis.set("yangge","niubi");
              //获取
              String yangge = jedis.get("yangge");
              System.out.println(yangge);
              //可以使用setex()方法存储可以指定过期时间的key value
              //将activecode,hehe,存入redis,并且20秒后自动删除键值对
              //将来可以存储一些有时限的激活码或者验证码
              jedis.setex("activecode",20,"hehe");
              //3.关闭连接
              jedis.close();
          }

  • 哈希类型  hash:map格式
    • hset
    • hget
    • hdel
    • /**
           * hash数据结构操作
           */
          @Test
          public void test3(){
              //1.获取连接
              Jedis jedis = new Jedis("localhost",6379);
              //2.操作
              //存储
              jedis.hset("user","name","李四");
              jedis.hset("user","age","23");
              jedis.hset("user","gender","man");
              //获取hash
              String name = jedis.hget("user", "name");
              String gender = jedis.hget("user", "gender");
              String age = jedis.hget("user", "age");
              System.out.println("name:"+name+"\n"+"age:"+age+"\n"+"gender:"+gender);
              //获取hash的所有map中的数据
              Map<String, String> user = jedis.hgetAll("user");
              //遍历集合 keyset
              Set<String> keySet = user.keySet();
              for (String key:keySet) {
                  //获取value
                  String value = user.get(key);
                  System.out.println(key+":"+value);
              }
              //3.关闭连接
              jedis.close();
          }

  • 列表类型  list:linkedList格式
    • loush/rpush
    • lrange
    • lpop/rpop
    • /**
           * List数据结构操作
           */
          @Test
          public void test4(){
              //1.获取连接
              Jedis jedis = new Jedis();
              //2.操作
              //list存储
              jedis.lpush("mylist","a","b","c");//从左边存 存进去为cba
              jedis.rpush("mylist","d","e","f");//从右边存 存进去为def
              //list获取
              List<String> mylist = jedis.lrange("mylist", 0, -1);
              System.out.println(mylist);
              //list弹出
              String element1 = jedis.lpop("mylist");//c
              System.out.println(element1);
              //3.关闭连接
              jedis.close();
          }
  • 集合类型  set:不允许重复元素
    • sadd
    • smembers
    • srem
    • /**
           * set数据结构操作  不允许有重复元素
           */
          @Test
          public void test5(){
              //1.获取连接
              Jedis jedis = new Jedis();
              //2.操作
              //set 存储
              jedis.sadd("myset","java","C++","php");
              //set 获取
              Set<String> myset = jedis.smembers("myset");
              System.out.println(myset);
              //3.关闭连接
              jedis.close();
          }

  • 有序集合类型  sortedset:不允许重复元素,且元素有顺序
    • zadd
    • zrange
    • zrem
    • /**
           * sortedset 数据结构操作  不允许有重复元素  且元素有顺序
           */
          @Test
          public void test6(){
              //1.获取连接
              Jedis jedis = new Jedis();
              //2.操作
              //sortedset存储
              jedis.zadd("mysortedset",60,"java");
              jedis.zadd("mysortedset",50,"c++");
              jedis.zadd("mysortedset",77,"python");
              //sortedset获取
              Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
              System.out.println(mysortedset);
              //3.关闭连接
              jedis.close();
          }

5.3 Jedis连接池:JedisPool

5.3.1 使用

  • 创建JedisPool连接池对象
  • 调用方法getResource()方法获取Jedis连接
  • @Test
        public void test7(){
            //0.船舰一个配置对象
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(50);//最大允许的连接数
            config.setMaxIdle(10);//最大的空闲连接
            //1.创建Jedis连接池对象
            JedisPool jedisPool = new JedisPool(config,"localhost",6379);
            //2.获取连接
            Jedis jedis = jedisPool.getResource();
            //3.使用
            jedis.set("hehe","haha");
            //4.关闭 归还到连接池中
            jedis.close();
        }

    #最大活动对象数     
    redis.pool.maxTotal=1000    
    #最大能够保持idel状态的对象数      
    redis.pool.maxIdle=100  
    #最小能够保持idel状态的对象数   
    redis.pool.minIdle=50    
    #当池内没有返回对象时,最大等待时间    
    redis.pool.maxWaitMillis=10000    
    #当调用borrow Object方法时,是否进行有效性检查    
    redis.pool.testOnBorrow=true    
    #当调用return Object方法时,是否进行有效性检查    
    redis.pool.testOnReturn=true  
    #“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1 
    redis.pool.timeBetweenEvictionRunsMillis=30000  
    #向调用者输出“链接”对象时,是否检测它的空闲超时;  
    redis.pool.testWhileIdle=true  
    # 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
    redis.pool.numTestsPerEvictionRun=50  
    #redis服务器的IP    
    redis.ip=xxxxxx  
    #redis服务器的Port    
    redis1.port=6379   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值