前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis复习笔记

Redis复习笔记

作者头像
框架师
发布2021-03-08 10:31:01
3120
发布2021-03-08 10:31:01
举报
文章被收录于专栏:墨白的Java基地

01.复习简介

Redis是Java开发面试必问的一项技术,所以这两天着重复习了Redis的使用以及相关概念

02.NOSql介绍与好处

疑问
  • mysql这种关系型数据库(磁盘数据库)在处理大数据量存储和大量用户并发访问获取数据方面,性能如何? 非常慢,对磁盘操作需要使用IO流,一个字节一个字节存取操作。所有数据读取到内存中后才可以操作。 使用内存数据库优化磁盘数据库,内存数据库就是非关系型数据库NOSQL
NOSql介绍

NOSql,全称 not only sql ,不仅仅是sql,泛指非关系型数据库。

非关系与关系型数据库的区别

特点

关系型数据库

非关系型数据库

存储介质

以文件的方式保存在电脑(服务器)磁盘中

通常只是存储在内存中,服务器关闭数据可能会部分丢失或全部丢失

优点

数据可以永久保存(非硬件故障/人为删库等情况)

存取速度很快

缺点

1)数据添加有校验过程2)查询的速度较慢3)DML的操作需要用到事务,以上这些会导致查询速度降低

数据不能持久化保存,可能会导致数据部分丢失或全部丢失

为什么需要NOSql?

因为是内存操作数据,非常快,会让系统性能大大提高。(解决了3高问题,高并发,高海量,高可用)

高并发:同一个时间点并发访问量非常大。

高海量:一个人访问的数据非常大,查询一个表,表中的数据有上亿条。

高可用:服务器崩溃了,服务器需要立刻重启后数据依然可用。

以后到底用关系型数据库还是非关系型数据库?

2个都用

小结
  • 非关系数据库的性能为什么高于关系型数据库? 因为内存存取远远大于磁盘读写的速度

03.NOSql数据库产品-Redis与Redis安装

非关系型数据库的产品

java领域主要使用redis,web阶段使用redis.

redis存储数据特点

使用键值对进行存取

redis安装与目录介绍
  1. 下载 windows版本,https://github.com/MSOpenTech/redis/tags 微软提供的 linux版本,官方提供的http://redis.io/download
  2. 解压完成安装
  3. 介绍redis的目录结构
使用redis存储数据体验步骤
  1. 双击运行redis服务器端redis-server.exe
  1. 双击运行redis客户端redis-cli.exe
  2. 在客户端上进行存取数据
小结
  • redis是以什么方式存储数据的? 键值对
  • redis客户端与服务器端软件的名字是什么? redis-cli.exe redis-server.exe
  • redis服务器使用的端口号是? 6379

04.redis存储数据的五种数据类型结构介绍

目标

redis常见可以存储5种数据类型

类型介绍
key的使用原则
代码语言:javascript
复制
   不建议key名字太长,通常不超过1024字节,如果太长会影响查询的速度。
代码语言:javascript
复制
   不建议太短,太短会降低可读性。
代码语言:javascript
复制
   一般在公司,都有统一命名规范。

见名知意,与java变量的命名规范一致

小结
  • redis支持常用五种数据类型都有哪些? string hash list set sorted set(zset)
  • 以后最常用使用哪种数据类型? string

05.redis数据类型命令1—String类型

操作命令语法

注意:string类型存储数据每个value限制512MB

String操作命令
小结
  • 以后java应用开发主要使用redis什么类型存储数据数据? string类型

06.redis数据类型命令2—hash类型

操作命令语法

注意:每个hash可以存储40亿个

操作
小结
  • 使用hash类型添加存储数据的语法? hset key field1 value1 hmset key field1 value1 field2 value2 …

07.redis数据类型命令3—list类型

操作命令语法

存储特点:可以存储多个value,数可重复,有序

添加元素语法

操作

1547174878543
1547174878543

效果

读取数据的语法

效果

删除元素

效果

查看列表的长度

lien

得到指定列表得长度

小结
  • list类型数据特点? 链表,有序,可重复

08.redis数据类型命令4—set类型

操作命令语法

存储数据特点:不可重复,无序

效果

小结

09.客户端工具使用与redis通用命令

客户端软件
操作命令语法

效果

10.redis持久化方式1-RDB策略

疑问
  • redis服务器关闭所有内存数据都会丢失吗? 不会全部丢失,默认只会丢失一部分,因为redis有持久化机制,redis会将内存数据符合条件时进行持久化,在redis重启的时候会恢复持久化的数据,这就是内存数据不会全部丢失。
RDB策略介绍

rdb持久化策略就是在符合一定条件下将内存所有数据持久化到磁盘中dump.rdb文件中。RDB策略是redis默认持久化策略。

rdb持久化内存的数据到dump.rdb文件,文件中会存储键值对数据。

rdb持久化的时候是将当时内存中所有的键值对一次性的持久化到dump.rdb

案例演示-采用RDB策略持久化数据测试

需求

实现步骤

注意

如果修改了配置文件redis.windows.conf,下次重启服务器端必须启动dos命令指定配置文件启动服务器。否则服务器无法识别配置文件的修改。

代码语言:javascript
复制
reids-server.exe redis.conf
小结
  • rdb策略的优点? 持久化的频率不高,意味着redis提供给用户操作数据性能更高
  • rdb策略的缺点? 持久化的频率不高,意味着丢失数据严重,数据安全性低

11.redis持久化方式2-AOF策略

AOF策略介绍

默认没有开启的策略,它的特点持久化的频率更高了,默认每秒持久化1次。每一秒内将最新的的操作写的数据进行持久化。

需要修改配置文件redis.windows.conf进行开启AOF策略,如下操作

开启AOF后,持久化策略有3个

AOF默认是采用的策略是每秒持久化一次,会导致持久化文件随着时间不断增大,AOF会记录每一个key所有修改操作的过程。

案例演示-采用AOF策略持久化数据测试
  • 需求 开启AOF策略进行持久化数据测试,观察其持久化数据的过程
  • 实现步骤
    1. 修改配置文件redi.windows.conf,开启aof
    1. 关闭客户端、服务器端,重启服务器端并指定配置文件启动
    2. 观察持久化的数据
疑问:每秒都持久化会导致日志文件过大,那么文件过大怎么办?需要开发人员做什么优化吗?

答:不需要开发人员做任何事情,redis对于aof策略有日志过大有重写机制(如下信息都在配置文件中)

小结
  • AOF策略的优点? 每秒持久化,具有更高的数据安全,如果服务器崩溃只会丢1秒内的数据

12.redis持久化RDB与AOF实践总结

疑问
  • RDB和AOF以后到底推荐使用哪一个呢? 2个都使用
官方建议

通常,如果你要想提供很高的数据保障性,那么建议你同时使用两种持久化方式。 如果你可以接受灾难带来的几分钟的数据丢失,那么你可以仅使用RDB。 很多用户仅使用了AOF,但是我们建议,既然RDB可以时不时的给数据做个完整的快照,并且提供更快的重启,所以最好还是也使用RDB。 因此,我们希望可以在未来(长远计划)统一AOF和RDB成一种持久化模式。

常见面试题

13.Jedis的使用1-基本使用

疑问
  • 对于关系型数据库我们都是使用jdbc操作mysql数据库存取数据,那么以后我们操作非关系型数据库是通过redis-cli客户端操作redis服务器存取数据吗? 使用java代码来操作
Jedis介绍

​ 点击文字下载相关代码jar包第三方提供工具包,可以非常方便的连接并操作redis数据库服务器密码:cmey

Jedis的api方法
代码语言:javascript
复制
import com.aicai.qa.tools.statics.config.SysConfigUtil;
import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @version 1.0
 * @date 2020/5/8
 */
public class RedisUtil {
    private JedisPool pool = null;

    private RedisUtil() {
        if (pool == null) {
            String ip = SysConfigUtil.getSysConfigUtil("redis.properties").getString("redis.host");
            int port = SysConfigUtil.getSysConfigUtil("redis.properties").getInt("redis.port");
            String password = SysConfigUtil.getSysConfigUtil("redis.properties").getString("redis.password");
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxTotal(SysConfigUtil.getSysConfigUtil("redis.properties").getInt("redis.maxTotal"));
            jedisPoolConfig.setMaxIdle(SysConfigUtil.getSysConfigUtil("redis.properties").getInt("redis.maxIdle"));
            jedisPoolConfig.setMaxWaitMillis(SysConfigUtil.getSysConfigUtil("redis.properties").getLong("redis.maxWaitMillis"));
            jedisPoolConfig.setTestOnBorrow(SysConfigUtil.getSysConfigUtil("redis.properties").getBoolean("redis.testOnBorrow"));
            if (password != null && !"".equals(password)) {
                // redis 设置了密码
                pool = new JedisPool(jedisPoolConfig, ip, port, 10000, password);
            } else {
                // redis 未设置密码
                pool = new JedisPool(jedisPoolConfig, ip, port, 10000);
            }
        }
    }

    /**
     * 获取指定key的值,如果key不存在返回null,如果该Key存储的不是字符串,会抛出一个错误
     *
     * @param key
     * @return
     */
    public String get(String key) {
        Jedis jedis = getJedis();
        String value = null;
        value = jedis.get(key);
        return value;
    }

    /**
     * 设置key的值为value
     *
     * @param key
     * @param value
     * @return
     */
    public String set(String key, String value) {
        Jedis jedis = getJedis();
        return jedis.set(key, value);
    }

    /**
     * 删除指定的key,也可以传入一个包含key的数组
     *
     * @param keys
     * @return
     */
    public Long del(String... keys) {
        Jedis jedis = getJedis();
        return jedis.del(keys);
    }

    /**
     * 通过key向指定的value值追加值
     *
     * @param key
     * @param str
     * @return
     */
    public Long append(String key, String str) {
        Jedis jedis = getJedis();
        return jedis.append(key, str);
    }

    /**
     * 判断key是否存在
     *
     * @param key
     * @return
     */
    public Boolean exists(String key) {
        Jedis jedis = getJedis();
        return jedis.exists(key);
    }

    /**
     * 设置key value,如果key已经存在则返回0
     *
     * @param key
     * @param value
     * @return
     */
    public Long setnx(String key, String value) {
        Jedis jedis = getJedis();
        return jedis.setnx(key, value);
    }

    /**
     * 设置key value并指定这个键值的有效期
     *
     * @param key
     * @param seconds
     * @param value
     * @return
     */
    public String setex(String key, int seconds, String value) {
        Jedis jedis = getJedis();
        return jedis.setex(key, seconds, value);
    }

    /**
     * 通过key 和offset 从指定的位置开始将原先value替换
     *
     * @param key
     * @param offset
     * @param str
     * @return
     */
    public Long setrange(String key, int offset, String str) {
        Jedis jedis = getJedis();
        return jedis.setrange(key, offset, str);
    }

    /**
     * 通过批量的key获取批量的value
     *
     * @param keys
     * @return
     */
    public List<String> mget(String... keys) {
        Jedis jedis = getJedis();
        return jedis.mget(keys);
    }

    /**
     * 批量的设置key:value,也可以一个
     *
     * @param keysValues
     * @return
     */
    public String mset(String... keysValues) {
        Jedis jedis = getJedis();
        return jedis.mset(keysValues);
    }

    /**
     * 批量的设置key:value,可以一个,如果key已经存在则会失败,操作会回滚
     *
     * @param keysValues
     * @return
     */
    public Long msetnx(String... keysValues) {
        Jedis jedis = getJedis();
        return jedis.msetnx(keysValues);
    }

    /**
     * 设置key的值,并返回一个旧值
     *
     * @param key
     * @param value
     * @return
     */
    public String getSet(String key, String value) {
        Jedis jedis = getJedis();
        return jedis.getSet(key, value);
    }

    /**
     * 通过下标 和key 获取指定下标位置的 value
     *
     * @param key
     * @param startOffset
     * @param endOffset
     * @return
     */
    public String getrange(String key, int startOffset, int endOffset) {
        Jedis jedis = getJedis();
        return jedis.getrange(key, startOffset, endOffset);
    }

    /**
     * 通过key 对value进行加值+1操作,当value不是int类型时会返回错误,当key不存在是则value为1
     *
     * @param key
     * @return
     */
    public Long incr(String key) {
        Jedis jedis = getJedis();
        return jedis.incr(key);
    }

    /**
     * 通过key给指定的value加值,如果key不存在,则这是value为该值
     *
     * @param key
     * @param integer
     * @return
     */
    public Long incrBy(String key, long integer) {
        Jedis jedis = getJedis();
        return jedis.incrBy(key, integer);
    }

    /**
     * 对key的值做减减操作,如果key不存在,则设置key为-1
     *
     * @param key
     * @return
     */
    public Long decr(String key) {
        Jedis jedis = getJedis();
        return jedis.decr(key);
    }

    /**
     * 减去指定的值
     *
     * @param key
     * @param integer
     * @return
     */
    public Long decrBy(String key, long integer) {
        Jedis jedis = getJedis();
        return jedis.decrBy(key, integer);
    }

    /**
     * 通过key获取value值的长度
     *
     * @param key
     * @return
     */
    public Long strLen(String key) {
        Jedis jedis = getJedis();
        return jedis.strlen(key);
    }

    /**
     * 通过key给field设置指定的值,如果key不存在则先创建,如果field已经存在,返回0
     *
     * @param key
     * @param field
     * @param value
     * @return
     */
    public Long hsetnx(String key, String field, String value) {
        Jedis jedis = getJedis();
        return jedis.hsetnx(key, field, value);
    }

    /**
     * 通过key给field设置指定的值,如果key不存在,则先创建
     *
     * @param key
     * @param field
     * @param value
     * @return
     */
    public Long hset(String key, String field, String value) {
        Jedis jedis = getJedis();
        return jedis.hset(key, field, value);
    }

    /**
     * 通过key同时设置 hash的多个field
     *
     * @param key
     * @param hash
     * @return
     */
    public String hmset(String key, Map<String, String> hash) {
        Jedis jedis = getJedis();
        return jedis.hmset(key, hash);
    }

    /**
     * 通过key 和 field 获取指定的 value
     *
     * @param key
     * @param failed
     * @return
     */
    public String hget(String key, String failed) {
        Jedis jedis = getJedis();
        return jedis.hget(key, failed);
    }

    /**
     * 设置key的超时时间为seconds
     *
     * @param key
     * @param seconds
     * @return
     */
    public Long expire(String key, int seconds) {
        Jedis jedis = getJedis();
        return jedis.expire(key, seconds);
    }

    /**
     * 通过key 和 fields 获取指定的value 如果没有对应的value则返回null
     *
     * @param key
     * @param fields 可以是 一个String 也可以是 String数组
     * @return
     */
    public List<String> hmget(String key, String... fields) {
        Jedis jedis = getJedis();
        return jedis.hmget(key, fields);
    }

    /**
     * 通过key给指定的field的value加上给定的值
     *
     * @param key
     * @param field
     * @param value
     * @return
     */
    public Long hincrby(String key, String field, Long value) {
        Jedis jedis = getJedis();
        return jedis.hincrBy(key, field, value);
    }

    /**
     * 通过key和field判断是否有指定的value存在
     *
     * @param key
     * @param field
     * @return
     */
    public Boolean hexists(String key, String field) {
        Jedis jedis = getJedis();
        return jedis.hexists(key, field);
    }

    /**
     * 通过key返回field的数量
     *
     * @param key
     * @return
     */
    public Long hlen(String key) {
        Jedis jedis = getJedis();
        return jedis.hlen(key);
    }

    /**
     * 通过key 删除指定的 field
     *
     * @param key
     * @param fields 可以是 一个 field 也可以是 一个数组
     * @return
     */
    public Long hdel(String key, String... fields) {
        Jedis jedis = getJedis();
        return jedis.hdel(key, fields);
    }

    /**
     * 通过key返回所有的field
     *
     * @param key
     * @return
     */
    public Set<String> hkeys(String key) {
        Jedis jedis = getJedis();
        return jedis.hkeys(key);
    }

    /**
     * 通过key返回所有和key有关的value
     *
     * @param key
     * @return
     */
    public List<String> hvals(String key) {
        Jedis jedis = getJedis();
        return jedis.hvals(key);
    }

    /**
     * 通过key获取所有的field和value
     *
     * @param key
     * @return
     */
    public Map<String, String> hgetall(String key) {
        Jedis jedis = getJedis();
        return jedis.hgetAll(key);
    }

    /**
     * 通过key向list头部添加字符串
     *
     * @param key
     * @param strs 可以是一个string 也可以是string数组
     * @return 返回list的value个数
     */
    public Long lpush(String key, String... strs) {
        Jedis jedis = getJedis();
        return jedis.lpush(key, strs);
    }

    /**
     * 通过key向list尾部添加字符串
     *
     * @param key
     * @param strs 可以是一个string 也可以是string数组
     * @return 返回list的value个数
     */
    public Long rpush(String key, String... strs) {
        Jedis jedis = getJedis();
        return jedis.rpush(key, strs);
    }

    /**
     * 通过key在list指定的位置之前或者之后 添加字符串元素
     *
     * @param key
     * @param where LIST_POSITION枚举类型
     * @param pivot list里面的value
     * @param value 添加的value
     * @return
     */
    public Long linsert(String key, BinaryClient.LIST_POSITION where,
                        String pivot, String value) {
        Jedis jedis = getJedis();
        return jedis.linsert(key, where, pivot, value);
    }

    /**
     * 通过key设置list指定下标位置的value
     * 如果下标超过list里面value的个数则报错
     *
     * @param key
     * @param index 从0开始
     * @param value
     * @return 成功返回OK
     */
    public String lset(String key, Long index, String value) {
        Jedis jedis = getJedis();
        return jedis.lset(key, index, value);
    }

    /**
     * 通过key从对应的list中删除指定的count个 和 value相同的元素
     *
     * @param key
     * @param count 当count为0时删除全部
     * @param value
     * @return 返回被删除的个数
     */
    public Long lrem(String key, long count, String value) {
        Jedis jedis = getJedis();
        return jedis.lrem(key, count, value);
    }

    /**
     * 通过key保留list中从strat下标开始到end下标结束的value值
     *
     * @param key
     * @param start
     * @param end
     * @return 成功返回OK
     */
    public String ltrim(String key, long start, long end) {
        Jedis jedis = getJedis();
        return jedis.ltrim(key, start, end);
    }

    /**
     * 通过key从list的头部删除一个value,并返回该value
     *
     * @param key
     * @return
     */
    public synchronized String lpop(String key) {

        Jedis jedis = getJedis();
        return jedis.lpop(key);
    }

    /**
     * 通过key从list尾部删除一个value,并返回该元素
     *
     * @param key
     * @return
     */
    synchronized public String rpop(String key) {
        Jedis jedis = getJedis();
        return jedis.rpop(key);
    }

    /**
     * 通过key从一个list的尾部删除一个value并添加到另一个list的头部,并返回该value
     * 如果第一个list为空或者不存在则返回null
     *
     * @param srckey
     * @param dstkey
     * @return
     */
    public String rpoplpush(String srckey, String dstkey) {
        Jedis jedis = getJedis();
        return jedis.rpoplpush(srckey, dstkey);
    }

    /**
     * 通过key获取list中指定下标位置的value
     *
     * @param key
     * @param index
     * @return 如果没有返回null
     */
    public String lindex(String key, long index) {
        Jedis jedis = getJedis();
        return jedis.lindex(key, index);
    }

    /**
     * 通过key返回list的长度
     *
     * @param key
     * @return
     */
    public Long llen(String key) {
        Jedis jedis = getJedis();
        return jedis.llen(key);
    }

    /**
     * 通过key获取list指定下标位置的value
     * 如果start 为 0 end 为 -1 则返回全部的list中的value
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<String> lrange(String key, long start, long end) {
        Jedis jedis = getJedis();
        return jedis.lrange(key, start, end);
    }

    /**
     * 通过key向指定的set中添加value
     *
     * @param key
     * @param members 可以是一个String 也可以是一个String数组
     * @return 添加成功的个数
     */
    public Long sadd(String key, String... members) {
        Jedis jedis = getJedis();
        return jedis.sadd(key, members);
    }

    /**
     * 通过key删除set中对应的value值
     *
     * @param key
     * @param members 可以是一个String 也可以是一个String数组
     * @return 删除的个数
     */
    public Long srem(String key, String... members) {
        Jedis jedis = getJedis();
        return jedis.srem(key, members);
    }

    /**
     * 通过key随机删除一个set中的value并返回该值
     *
     * @param key
     * @return
     */
    public String spop(String key) {
        Jedis jedis = getJedis();
        return jedis.spop(key);
    }

    /**
     * 通过key获取set中的差集
     * 以第一个set为标准
     *
     * @param keys 可以 是一个string 则返回set中所有的value 也可以是string数组
     * @return
     */
    public Set<String> sdiff(String... keys) {
        Jedis jedis = getJedis();
        return jedis.sdiff(keys);
    }

    /**
     * 通过key获取set中的差集并存入到另一个key中
     * 以第一个set为标准
     *
     * @param dstkey 差集存入的key
     * @param keys   可以 是一个string 则返回set中所有的value 也可以是string数组
     * @return
     */
    public Long sdiffstore(String dstkey, String... keys) {
        Jedis jedis = getJedis();
        return jedis.sdiffstore(dstkey, keys);
    }

    /**
     * 通过key获取指定set中的交集
     *
     * @param keys 可以 是一个string 也可以是一个string数组
     * @return
     */
    public Set<String> sinter(String... keys) {
        Jedis jedis = getJedis();
        return jedis.sinter(keys);
    }

    /**
     * 通过key获取指定set中的交集 并将结果存入新的set中
     *
     * @param dstkey
     * @param keys   可以 是一个string 也可以是一个string数组
     * @return
     */
    public Long sinterstore(String dstkey, String... keys) {
        Jedis jedis = getJedis();
        return jedis.sinterstore(dstkey, keys);
    }

    /**
     * 通过key返回所有set的并集
     *
     * @param keys 可以 是一个string 也可以是一个string数组
     * @return
     */
    public Set<String> sunion(String... keys) {
        Jedis jedis = getJedis();
        return jedis.sunion(keys);
    }

    /**
     * 通过key返回所有set的并集,并存入到新的set中
     *
     * @param dstkey
     * @param keys   可以 是一个string 也可以是一个string数组
     * @return
     */
    public Long sunionstore(String dstkey, String... keys) {
        Jedis jedis = getJedis();
        return jedis.sunionstore(dstkey, keys);
    }

    /**
     * 通过key将set中的value移除并添加到第二个set中
     *
     * @param srckey 需要移除的
     * @param dstkey 添加的
     * @param member set中的value
     * @return
     */
    public Long smove(String srckey, String dstkey, String member) {
        Jedis jedis = getJedis();
        return jedis.smove(srckey, dstkey, member);
    }

    /**
     * 通过key获取set中value的个数
     *
     * @param key
     * @return
     */
    public Long scard(String key) {
        Jedis jedis = getJedis();
        return jedis.scard(key);
    }

    /**
     * 通过key判断value是否是set中的元素
     *
     * @param key
     * @param member
     * @return
     */
    public Boolean sismember(String key, String member) {
        Jedis jedis = getJedis();
        return jedis.sismember(key, member);
    }

    /**
     * 通过key获取set中随机的value,不删除元素
     *
     * @param key
     * @return
     */
    public String srandmember(String key) {
        Jedis jedis = getJedis();
        return jedis.srandmember(key);
    }

    /**
     * 通过key获取set中所有的value
     *
     * @param key
     * @return
     */
    public Set<String> smembers(String key) {
        Jedis jedis = getJedis();
        return jedis.smembers(key);
    }


    /**
     * 通过key向zset中添加value,score,其中score就是用来排序的
     * 如果该value已经存在则根据score更新元素
     *
     * @param key
     * @param score
     * @param member
     * @return
     */
    public Long zadd(String key, double score, String member) {
        Jedis jedis = getJedis();
        return jedis.zadd(key, score, member);
    }

    /**
     * 通过key删除在zset中指定的value
     *
     * @param key
     * @param members 可以 是一个string 也可以是一个string数组
     * @return
     */
    public Long zrem(String key, String... members) {
        Jedis jedis = getJedis();
        return jedis.zrem(key, members);
    }

    /**
     * 通过key增加该zset中value的score的值
     *
     * @param key
     * @param score
     * @param member
     * @return
     */
    public Double zincrby(String key, double score, String member) {
        Jedis jedis = getJedis();
        return jedis.zincrby(key, score, member);
    }

    /**
     * 通过key返回zset中value的排名
     * 下标从小到大排序
     *
     * @param key
     * @param member
     * @return
     */
    public Long zrank(String key, String member) {
        Jedis jedis = getJedis();
        return jedis.zrank(key, member);
    }

    /**
     * 通过key返回zset中value的排名
     * 下标从大到小排序
     *
     * @param key
     * @param member
     * @return
     */
    public Long zrevrank(String key, String member) {
        Jedis jedis = getJedis();
        return jedis.zrevrank(key, member);
    }

    /**
     * 通过key将获取score从start到end中zset的value
     * socre从大到小排序
     * 当start为0 end为-1时返回全部
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> zrevrange(String key, long start, long end) {
        Jedis jedis = getJedis();
        return jedis.zrevrange(key, start, end);
    }

    /**
     * 通过key返回指定score内zset中的value
     *
     * @param key
     * @param max
     * @param min
     * @return
     */
    public Set<String> zrangebyscore(String key, String max, String min) {
        Jedis jedis = getJedis();
        return jedis.zrevrangeByScore(key, max, min);
    }

    /**
     * 通过key返回指定score内zset中的value
     *
     * @param key
     * @param max
     * @param min
     * @return
     */
    public Set<String> zrangeByScore(String key, double max, double min) {
        Jedis jedis = getJedis();
        return jedis.zrevrangeByScore(key, max, min);
    }

    /**
     * 返回指定区间内zset中value的数量
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    public Long zcount(String key, String min, String max) {
        Jedis jedis = getJedis();
        return jedis.zcount(key, min, max);
    }

    /**
     * 通过key返回zset中的value个数
     *
     * @param key
     * @return
     */
    public Long zcard(String key) {
        Jedis jedis = getJedis();
        return jedis.zcard(key);
    }

    /**
     * 通过key获取zset中value的score值
     *
     * @param key
     * @param member
     * @return
     */
    public Double zscore(String key, String member) {
        Jedis jedis = getJedis();
        return jedis.zscore(key, member);
    }

    /**
     * 通过key删除给定区间内的元素
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Long zremrangeByRank(String key, long start, long end) {
        Jedis jedis = getJedis();
        return jedis.zremrangeByRank(key, start, end);
    }

    /**
     * 通过key删除指定score内的元素
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Long zremrangeByScore(String key, double start, double end) {
        Jedis jedis = getJedis();
        return jedis.zremrangeByScore(key, start, end);
    }

    /**
     * 返回满足pattern表达式的所有key
     * keys(*)
     * 返回所有的key
     *
     * @param pattern
     * @return
     */
    public Set<String> keys(String pattern) {
        Jedis jedis = getJedis();
        return jedis.keys(pattern);
    }

    /**
     * 通过key判断值得类型
     *
     * @param key
     * @return
     */
    public String type(String key) {
        Jedis jedis = getJedis();
        return jedis.type(key);
    }


    private void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    private Jedis getJedis() {
        return pool.getResource();
    }

    public static RedisUtil getRedisUtil() {
        return new RedisUtil();
    }

}
jedis的使用步骤
  1. 导入jedis的jar包
  2. 利用jedis的api方法操作redis数据库
jedis基本使用代码
代码语言:javascript
复制
public class JedisTest01 {
    public static void main(String[] args) {
        // 1.创建连接redis对象Jedis
        Jedis jedis = new Jedis("localhost", 6379);

        // 2.写入数据到redis中
        jedis.set("name","mobai");

        // 3.读取数据
        String name = jedis.get("name");
        System.out.println("name = " + name); // name = mobai

        // 4.程序运行完毕关闭进程
        jedis.close();
    }
}
小结
  • jedis的作用是什么? 使用java代码操作redis数据库
  • jedis使用完成后注意什么? 关闭

14.Jedis的使用2-使用jedis连接池优化

疑问
  • 每次使用Jedis操作redis服务器存储数据都需new Jedis()连接对象,这样好不好? 不好,应该使用连接池控制连接的数量,保证服务器的稳定性
使用jedis连接池优化代码
代码语言:javascript
复制
public static void main(String[] args) {
        // 1.从连接池获取jedis连接
        // 1.1创建配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        // 设置最大连接数
        config.setMaxTotal(10);
        // 设置最大超时时间
        config.setMaxWaitMillis(30000);

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

        // 3.获取连接
        Jedis jedis = jedisPool.getResource();

        //    4.写入数据到redis中
        jedis.set("name", "mobai");

        // 5.读取数据
        String str = jedis.get("name");
        System.out.println("str = " + str);

        // 6.关闭连接
        jedis.close();
    }
小结
  • 连接池类是什么? JedisPool
  • 一般都配置什么参数给连接池? 最大连接数 用户等待超时时间 15.Jedis的使用3-用工具类优化连接池操作
疑问
  • 每次操作redis都要new JedisPool()连接池会造成代码冗余,并且将redis服务器地址写死在代码中不利于以后的修改,那么怎么办呢? 使用工具类优化代码冗余
代码结构
jedis配置文件
代码语言:javascript
复制
# 最大连接数
maxTotal=10
# 最大超时时间
maxWaitMillis=30000
# 服务器地址
host=localhost
# 端口号
port=6379
使用工具类优化连接池操作代码
代码语言:javascript
复制
public class JedisUtil {
    // 注入JedisPool
    private static JedisPool jedisPool;

    static {
        //ResourceBundle专门用于解析properties配置文件的类,只要根据类路径下面的文件名就可以解析
        ResourceBundle resourceBundle = ResourceBundle.getBundle("jedis");
        int maxTotal = Integer.parseInt(resourceBundle.getString("maxTotal"));
        int maxWaitMillis = Integer.parseInt(resourceBundle.getString("maxWaitMillis"));
        String host = resourceBundle.getString("host");
        int port = Integer.parseInt(resourceBundle.getString("port"));

        // 1.创建配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxWaitMillis(maxWaitMillis);

        // 2.创建连接池对象
        jedisPool = new JedisPool(config, host, port);
    }

    /**
     * CreateTime: 2020/5/8 14:09
     * Return:redis.clients.jedis.Jedis
     * MethodName:[getJedis] && Param:[[]]
     * 方法说明: 获取连接对象
     */
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }
}
使用工具类测试代码
代码语言:javascript
复制
public static void main(String[] args) {
        // 1.从工具类获取jedis连接
        Jedis jedis = JedisUtil.getJedis();
        //2.写入数据到redis中
        jedis.set("name", "mobai");

        //3.读取数据
        String name = jedis.get("name");
        System.out.println("name=" + name);

        //4.关闭连接对象
        jedis.close();//放回连接池
    }
小结
  • 使用工具类优化连接池操作有什么好处? 解决代码的冗余
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01.复习简介
  • 02.NOSql介绍与好处
    • 疑问
      • NOSql介绍
        • 非关系与关系型数据库的区别
          • 为什么需要NOSql?
            • 以后到底用关系型数据库还是非关系型数据库?
              • 小结
              • 03.NOSql数据库产品-Redis与Redis安装
                • 非关系型数据库的产品
                  • redis存储数据特点
                    • redis安装与目录介绍
                      • 使用redis存储数据体验步骤
                        • 小结
                        • 04.redis存储数据的五种数据类型结构介绍
                          • 目标
                            • 类型介绍
                              • key的使用原则
                                • 小结
                                • 05.redis数据类型命令1—String类型
                                  • 操作命令语法
                                    • String操作命令
                                      • 小结
                                      • 06.redis数据类型命令2—hash类型
                                        • 操作命令语法
                                          • 操作
                                            • 小结
                                            • 07.redis数据类型命令3—list类型
                                              • 操作命令语法
                                                • 小结
                                                • 08.redis数据类型命令4—set类型
                                                  • 操作命令语法
                                                    • 小结
                                                    • 09.客户端工具使用与redis通用命令
                                                      • 客户端软件
                                                        • 操作命令语法
                                                        • 10.redis持久化方式1-RDB策略
                                                          • 疑问
                                                            • RDB策略介绍
                                                              • 案例演示-采用RDB策略持久化数据测试
                                                                • 注意
                                                                  • 小结
                                                                  • 11.redis持久化方式2-AOF策略
                                                                    • AOF策略介绍
                                                                      • 案例演示-采用AOF策略持久化数据测试
                                                                        • 疑问:每秒都持久化会导致日志文件过大,那么文件过大怎么办?需要开发人员做什么优化吗?
                                                                          • 小结
                                                                          • 12.redis持久化RDB与AOF实践总结
                                                                            • 疑问
                                                                              • 官方建议
                                                                                • 常见面试题
                                                                                • 13.Jedis的使用1-基本使用
                                                                                  • 疑问
                                                                                    • Jedis介绍
                                                                                      • Jedis的api方法
                                                                                        • jedis的使用步骤
                                                                                          • jedis基本使用代码
                                                                                            • 小结
                                                                                            • 14.Jedis的使用2-使用jedis连接池优化
                                                                                              • 疑问
                                                                                                • 使用jedis连接池优化代码
                                                                                                  • 小结
                                                                                                    • 疑问
                                                                                                      • 代码结构
                                                                                                        • jedis配置文件
                                                                                                          • 使用工具类优化连接池操作代码
                                                                                                            • 使用工具类测试代码
                                                                                                              • 小结
                                                                                                              相关产品与服务
                                                                                                              云数据库 Redis
                                                                                                              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                                                                                                              领券
                                                                                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档