Redis、Jedis

1 NoSQL

介绍

NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。

为什么学习NoSQL?

互联网产品的特点:

高并发、高性能、高可用、海量数据

传统的关系数据库就出现了性能和扩展的瓶颈,非关系型数据库应时而生,解决了互联网三高和海量数据的问题

NoSQL和关系型数据库是互补关系,在各自的应用场景都有自己特点,一般情况下我们使用关系数据库来持久化数据,对一切热点数据通过Nosql来作为缓存

主流产品

分类特点代表产品
键值存储数据一般存在内存中,读写速度快(10w/s),适合作为缓存服务 当成map即可redis
文档型数据库数据结构要求不严格,适合存储结构不确定或者价值较低的数据mongodb
列存储数据库查找速度快,更容易进行分布式扩展,适合作为文件存储服务Hbase
图形数据库使用“图结构”进行存储,适合做社交网络计算等等Neo4j

2 Redis介绍

​ Redis(Remote Dictionary Server)是用C语言开发的一个开源的高性能键值对数据库。它的所有数据都是保存在内存中的,这也就决定了其读写速度之快,是其它硬盘保存数据的系统所无法匹敌的。

官方曾经给出过一组测试数据,50个并发执行100000个请求: 读的速度是110000次/s,写的速度是81000次/s

3 Redis安装和使用

  • 下载
    Reids官网地址:http://redis.io
    中文网地址:https://www.redis.net.cn/

    • 安装
      windows版本解压缩即可
  • 目录(windows版)
    redis.windows.conf:配置文件
    redis-cli.exe:redis的客户端
    redis-server.exe:redis服务器端

  • 启动

    • 方式1 :
      • 先双击服务器端 redis-server.exe
      • 再双击客户端 redis-cli.exe
    • 方式2:在当前解压后的目录下 cmd进入dos窗口
      • 先启动服务器端 redis-server.exe redis.windows.conf
      • 再启动客户端 redis-cli.exe

    redis服务器默认的端口号:6379

  • 关闭

    • 建议在客户端使用:shutdown
    • 也可以直接点 x

4 Redis数据结构【重点】

redis存储的是:key-value格式的数据,其中key是字符串类型,value支持五种数据类型(存到数据库中都是字符串)

  1. string
  2. hash (map)
  3. list (linkedlist)
  4. set (无序唯一)
  5. zset (sorted set 有序set)

三 redis命令操作

1 字符串(string)

添加 : set 键名 值

查询 : get 键名

删除 : del 键名

新增且设置时间 : setex 键名 秒数 值

查看剩余存活时间 : ttl 键名

  • 正整数 : 剩余时间
  • -1 : 永不过时
  • -2 : 不存在
    扩展:
  • incr 键名 :自增
  • decr 键名 :自减

2 哈希(hash)

value是一个map

添加 : hset 键名 字段 值

查询 : hget 键名 字段

删除 : hdel 键名 字段

扩展命令:

  • hmset 键名 子键1 子值1 子键2 子值2 :一次性给键设置多个子键和值
  • hmget 键名 子键1 子键2 :一次获取多个子键的值
  • hgetall 键名 :获取所有的子键和值

3 列表(list)

LinkedList 有序

添加

  • lpush 键名 值1 值2 值3 … 从左边开始一个一个的往前面上加
  • rpush 键名 值1 值2 值3 … 从右边开始一个一个的往末尾上加

查询 : lrange 键名 开始索引 结束索引

  • lrange 键名 0 -1 :查询所有

删除 :

  • lpop 键名 : 返回且移除左边的第一个元素
  • rpop 键名 : 返回且移除右边的第一个元素

扩展命令:

  • llen 键名 :获取集合的长度

4 集合(set)

唯一无序

添加 : sadd 键名 值1 值2 值3

删除:srem 键名 值1 值2

查询

  • smembers 键名 : 查询所有
  • sismember 键名 值 : 判断该值是否存在

扩展命令:

  • 长度 : scard 键名
  • 集合运算 :
    • sunion 键1 键2 :并集 我有加你有
    • sdiff 键1 键2 :差集 我有你没有
    • sinter 键1 键2 :交集 我有你也有
    • 也可以将他们的运行结果放入一个新集合中
      • sxxxstore 新集合 键1 键2
      • 例如: sunionstore s3 s1 s2 将s1和s2的并集放入s3中

5 有序集合(zset)

有序

添加 : zadd 键名 分数1 值1 分数2 值2

查询 : zrange 键名 开始索引 结束索引 [withscores]

查询某一个键的分数 : zscore 键名 值

删除 : zrem 键名 值1 值2

6 通用命令

del 键名 : 删除指定key

keys * :查询当去数据库下所有的key

type 键名 : 查询该键的类型

exists 键名 : 查询该键是否存在当前的数据库中

扩展命令:

  • 一个redis实例包含16个数据库,默认使用的索引为0的数据库 : select 索引
    • 建议大家开发项目的时候 一个项目用一个实例
  • flushdb : 清除当前数据库中所有的内容
  • flushall : 清除当前实例中所有数据库中的内容

四 redis持久化

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化(RDB和AOF),可以同时使用。

  • RDB(快照方式):默认方式.文件名称:dump.rdb

    rdb默认的快照规则:

    save 900 1 当15分钟之内有1个key发生变化就拍照

    save 300 10 当300秒之内有10个key发生变化就拍照

    save 60 10000 当60秒之内有1w个key发生变化就拍照

    重启服务器后,默认是从rdb文件中恢复数据到内存中

  • AOF(追加命令到文件中),需要手动开启的,文件名称:appendonly.aof

    appendfsync always 每执行一个命令,就会把命令追加到文件中,和关系型数据库相似

    appendfsync everysec 每一秒钟,把所有的操作命令追加到文件中

    appendfsync no 不同步,等同于rdb

    启动的时候需要指定配置文件启动

    修改配置文件redis.windows.conf中 appendonly no 将他的值改成yes,重启服务器就生效,

    虽然开启了aof,但是rdb依然能用.只不过是,当服务器重启的时候,从aof文件将数据恢复到内存中.


当我们正常关闭redis服务器的时候,他会通过不同的方式将内存中的数据保存到硬盘文件中.再次启动的时候,会去文件中把数据恢复到内存中.

若我们把redis作为缓存使用,建议使用rdb方式,高效; 若数据需要不时的持久化,建议使用aof方式.

缓存是允许有数据丢失.

1 什么是Jedis

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。

在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis

jedis对redis 相当于 jdbc对关系型数据库

2 快速入门
步骤分析

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
@Test
public void helloJedis(){
    //1.创建jedis对象
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    //2.操作redis数据库
    jedis.set("jedis","hi");

    String result = jedis.get("jedis");
    System.out.println(result);

    //3.释放资源
    jedis.close();
}

常用API

方法解释
new Jedis(host, port)创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口
set(key,value)设置字符串类型的数据
get(key)获得字符串类型的数据
hset(key,field,value)设置哈希类型的数据
hget(key,field)获得哈希类型的数据
lpush(key,values)设置列表类型的数据
lpop(key)列表左面弹栈
rpop(key)列表右面弹栈
del(key)删除指定的key
setex(key,秒数,value)设置一个key且设置存活时间

3 连接池

jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术。

步骤分析

@Test
public void helloJedisPool(){
    //0.创建连接池的配置对象
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(10);//最大连接数
    config.setMaxIdle(2);//最大的空闲连接数量
    config.setMaxWaitMillis(2000);//最大的等待获取连接的时间

    //1.创建连接池对象
    JedisPool pool = new JedisPool(config,"127.0.0.1",6379);

    //2.从连接池中获取连接
    Jedis jedis = pool.getResource();

    //3.操作redis数据库
    System.out.println(jedis.get("jedis"));
    System.out.println(jedis.get("hhhh"));

    //4.释放资源
    jedis.close();
}

4 抽取工具类

jedis.properties

redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=50
redis.maxIdle=10

JedisUtils

public class JedisUtils {
    //提供一个连接池变量
    private static JedisPool pool;

    //在静态代码块中进行初始化操作
    static{
        //加载配置文件
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");

        //创建配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(bundle.getString("redis.maxTotal")));
        config.setMaxIdle(Integer.parseInt(bundle.getString("redis.maxIdle")));

        //初始化连接池
        pool = new JedisPool(config,bundle.getString("redis.host"),Integer.parseInt(bundle.getString("redis.port")));
    }


    //提供获取jedis的方法
    public static Jedis getJedis(){
        return pool.getResource();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值