Redis中的通用指令

96 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

通用指令

对于各个数据类型,redis提供了各自的指令来操作,而对于所有的数据类型,它们都有着一些通用的指令用来控制,一起来看看吧。

\

首先是删除指定的key:

del key

判断指定的key是否存在:

exists key

获取key的类型:

type key

key的时效性操作在前面已经简单接触了一下,现在来仔细了解了解,首先是为key设置有效时间:

expire key seconds										# 设置有效时间,单位:秒
pexpire key milliseconds							# 设置有效时间,单位:毫秒
expireat key timestamp								# 设置时间戳,单位:秒
pexpireat key milliseconds-timestamp	# 设置时间戳,单位:毫秒

获取key的剩余有效时间:

ttl key			# 返回有效时间,单位:秒
pttl key		# 返回有效时间,单位:毫秒

需要注意的是,这两个指令都能够返回key的剩余有效时间,所以若是key不存在,则返回-2;若是key存在但未设置有效时间,则返回-1;否则返回key的剩余有效时间。

\

将key从时效性切换为永久性:

persist key

redis提供了一些常用的查询指令帮助我们了解key的信息,比如查询指定条件的key:

keys pattern

其中pattern是匹配模式,若是指定为 * 则查询所有key:

keys *

它提供了三种匹配模式:

  • *:匹配任意数量的任意符号
  • ?:匹配一个任意符号
  • []:匹配一个指定符号

\

为key修改名字:

rename key newkey
renamenx key newkey

需要注意 rename 指令将当前key修改为已经存在的key时,该key的值会被覆盖,而 renamenx 会报错,所以 renamenx 能够避免覆盖的情况发生。

\

对所有key排序:

sort

随着数据量的逐渐增大,key极易出现重复、出错的情况,大量的数据混杂在一起也很难分别处理,为此,redis提供了数据库的概念。

redis为每个服务提供了16个数据库,编号为0~15,每个数据库之间的数据是相互独立的。

\

切换数据库:

select index

默认使用的是0号数据库,若是想切换至3号,则:

select 3

数据移动:

move key db

将当前数据库指定的key移动到指定的数据库,比如将 name 移动到3号数据库(移动之后,原数据库的key就不存在了):

move name 3

数据清除:

dbsize		# 返回当前数据库的key数量
flushdb		# 清空当前数据库的key
flushall	# 清空所有数据库的key

Jedis

在项目开发中,我们需要使用Java来帮助我们操作redis,所以来了解一下Java操作redis的工具——Jedis。

\

引入依赖:

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.3.0</version>
</dependency>

首先来测试一下能够连接成功:

@Test
public void testJedis(){
    // 连接redis
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    System.out.println(jedis.ping());
}

输出结果:

PONG

输出 PONG 则说明连接成功了,那么jedis该如何操作redis呢?

\

操作方法与在redis中的操作一模一样,所以我们可以直接调用同名的方法即可,比如保存一个string类型的数据:

@Test
public void testJedis(){
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    jedis.set("name","zhangsan");
    String name = jedis.get("name");
    System.out.println(name);
}

若是保存list数据,则调用 lpush 或 rpush 方法:

@Test
public void testJedis(){
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    jedis.lpush("nums","1","2","3","4","5");
    // 获取所有数据
    List<String> nums = jedis.lrange("nums",0,-1);
    for (String num : nums) {
        System.out.println(num);
    }
}

若是保存hash数据,则调用 hset 方法:

@Test
public void testJedis() {
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    jedis.hset("user", "name", "zhangsan");
    jedis.hset("user", "age", "20");
    String name = jedis.hget("user", "name");
    String age = jedis.hget("user", "age");
    System.out.println(name + ":" + age);
}

因为需要频繁操作jedis,所以我们可以为其编写一个简单的工具类:

package com.wwj.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;

public class JedisUtil {

    private static JedisPool jedisPool = null;
    private static final String host;
    private static final Integer port;
    private static final Integer maxTotal;
    private static final Integer maxIdle;

    /**
     * 加载连接池,只执行一次
     */
    static {
        // 加載配置文件
        ResourceBundle bundle = ResourceBundle.getBundle("redis");
        host = bundle.getString("redis.host");
        port = Integer.parseInt(bundle.getString("redis.port"));
        maxTotal = Integer.parseInt(bundle.getString("redis.maxTotal"));
        maxIdle = Integer.parseInt(bundle.getString("redis.maxIdle"));
        // 配置连接池信息
        JedisPoolConfig config = new JedisPoolConfig();
        // 设置最大连接数
        config.setMaxTotal(maxTotal);
        // 设置活动连接数
        config.setMaxIdle(maxIdle);
        jedisPool = new JedisPool(config, host, port);
    }

    /**
     * 获取Jedis连接
     *
     * @return
     */
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }
}

配置文件:

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

Linux下的Redis

现在我们已经对redis有了一个大致的认识,下面我们就在linux环境下来看看redis的一些更加高级的操作,首先下载redis的压缩包:

wget http://download.redis.io/releases/redis-4.0.0.tar.gz

解压一下:

tar -zxvf redis-4.0.0.tar.gz

进入解压后的目录,然后进行编译安装:

cd redis-4.0.0
make install

首先将redis中的配置文件复制一份:

cp redis.conf redis-6379.conf

并修改配置文件:

daemonize yes								# 以守护进程的方式启动
logfile "6379.log"					# 指定日志文件名
dir /opt/redis-4.0.0/logs		# 指定日志的存放位置

此时以该配置文件启动redis:

redis-server redis-6379.conf

我们可以查看日志来判断redis是否成功启动了:

cd /opt/redis-4.0.0/logs
cat 6379.log

日志内容:

8454:C 15 Mar 02:57:25.275 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8454:C 15 Mar 02:57:25.276 # Redis version=4.0.0, bits=64, commit=00000000, modified=0, pid=8454, just started
8454:C 15 Mar 02:57:25.276 # Configuration loaded
8455:M 15 Mar 02:57:25.279 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8455:M 15 Mar 02:57:25.281 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use

通过日志我们发现,6379端口好像被占用了,我们只需查看哪个应用占用了6379端口,并将其kill掉然后重新启动redis即可。

\

通过配置文件启动的方式可以非常方便地实现多个redis服务的启动,现在复制一个刚才的配置文件:

cp redis-6379.conf redis-6380.conf

然后修改redis-6380.conf:

port 6380

把端口修改为6380,然后启动该redis服务:

redis-server redis-6380.conf
logfile "6380.log"

同样检查日志即可判断redis服务是否成功启动。

\

服务启动完成后,若是想连接redis进行操作,则:

redis-cli -p 6379

若是不指定端口号,则默认使用6379端口进行连接。