前言

REmote Dictionary Server(Redis)是一个由Salvatore Sanfillppo写的key-value存储系统。
Redis是一个开源的使用ANSUI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
需要提前掌握的知识

  • 基本的数据结构
    • String/Hash/List/Set/Sorted Set
  • 特点:
    • 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次进行使用;
    • 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
    • 支持数据的备份,即master-slave模式的数据备份。
  • Redis优势
    • 性能极高,读写速度快;
    • 丰富的数据类型,redis支持二进制案例的String,List,Hashes,Sets及Ordered Sets数据类型操作。
    • 原子,redis的所有操作都是原子性的,要么成功执行要么完全不执行。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 丰富的特性,支持publish/subscribe,通知,key过期等等特性。

初级部分

Redis安装

  • Windows下安装
  • Ubuntu下安装
  • cloud studio中运行redis

Redis配置

配置文件在redis安装目录下,文件名为redis.conf可以通过CONFIG命令来查看或设置配置项。

  • 语法
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

# use * get config programs
redis 127.0.0.1:6379> CONFIG GET *

编辑配置

可以通过修改redis.conf文件或使用CONFIG set命令来修改配置

  • 语法
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

# 实例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"

参数说明

redis配置项说明open in new window

Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

String字符串

  • string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
  • string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
  • string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
  • 实例

    redis 127.0.0.1:6379> SET name "runoob"
    OK
    redis 127.0.0.1:6379> GET name
    "runoob"
    
    • ⚠️一个键最大能存储512MB

Hash哈希

使用DEL runoob删除前面测试用过的可以,不然会报错!

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET myhash field1
"Hello"
redis 127.0.0.1:6379> HGET myhash field2
"World"
  • 实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。

  • 每个 hash 可以存储 232 -1 键值对(40多亿)。

List列表

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

# 使用lpush命令向列表中插入数据
lpush runoob redis
lpush runoob python
lrange runoob 0 10
1) "python"
2) "redis"
  • 列表最多可以存储$2^{32} - 1$个元素,每个列表可存储40多亿。

SET集合

  • Redis的Set是string类型的无序集合。
  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd命令

添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

sadd runoob redis
sadd runoob python
sadd runoob python
sadd runoob C++

smembers runoob
1) "redis"
2) "C++"
3) "python"
  • 以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
  • 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。

zadd命令

添加元素到集合,元素在集合中存在则更新对应score

zadd key score member

# 实例
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

Redis命令

是用于在redis服务器上执行操作,要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。
具体学习地址(中文简体教程)open in new window

Redis用于管理的命令

  • 键Key命令:用于管理redis的键。基本命令非常多!
  • String命令:用于管理redis的字符串值。
  • Hash命令:
  • List命令:
  • Set集合命令:用于管理redis的集合类型值。
  • Redis有序集合命令:

Redis HyperLogLog

  • 是用来做基数统计的算法,HyperLogLog的优点是在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的并且是非常小的。

  • 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

  • HyperLogLog只计算基数,不存储输入的元素本身。

基数

即一个数据集中不重复元素的个数。基数估计就是在误差可接收范围内,快速计算基数。

# 实例
PFADD runoobkey "redis"
1
PFADD runoobkey "python"
1
PFADD runoobkey "java"
1
PFCOUNT runoobkey
3

Redis HyperLogLog命令

基本命令

  • PFADD key element [element ...]
    添加指定元素到 HyperLogLog 中。

  • PFCOUNT key [key ...]
    返回给定 HyperLogLog 的基数估算值。

  • PFMERGE destkey sourcekey [sourcekey ...]
    将多个 HyperLogLog 合并为一个 HyperLogLog

Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。

常用命令

  • PSUBSCRIBE pattern [pattern ...]
    订阅一个或多个符合给定模式的频道。

  • PUBSUB subcommand [argument [argument ...]]
    查看订阅与发布系统状态。

  • PUBLISH channel message
    将信息发送到指定的频道。

  • PUNSUBSCRIBE [pattern [pattern ...]]
    退订所有给定模式的频道。

  • SUBSCRIBE channel [channel ...]
    订阅给定的一个或多个频道的信息。

  • UNSUBSCRIBE [channel [channel ...]]
    指退订给定的频道。

redis 事务

Redis事务可以一次执行多个命令。并且带有以下几个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
  • 事务从开始到执行经历三个阶段:
    • 开始事务
    • 命令入队
    • 执行事务
# 实例
redis 127.0.0.1:6379> MUTI # 开始一个事务
OK

# 命令入队
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "MAstering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   1) "C++"
   2) "Programming"
  • ⚠️ 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

redis 事务命令

1、 DISCARD : 取消事务,放弃执行事务内的所有命令
2、 EXEC: 执行所有事务块内的命令
3、 MUTI: 标记一个事务块的开始
4、 UNWATCH: 取消WATCH命令对所有key的监视。
5、 WATCH key[key ...]:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

redis 脚本

使用Lua解释器来执行脚本。redis2.6版本通过内嵌支持Lua环境。执行脚本的常用命令为EVAL。

# 实例
redis 127.0.0.1:6379> "return {KEYS[1], KEYs[2], ARGV[1], ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

脚本命令

  • EVAL script numkeys key [key ...] arg [arg ...]
    执行 Lua 脚本。

  • EVALSHA sha1 numkeys key [key ...] arg [arg ...]
    执行 Lua 脚本。

  • SCRIPT EXISTS script [script ...]
    查看指定的脚本是否已经被保存在缓存当中。

  • SCRIPT FLUSH
    从脚本缓存中移除所有脚本。

  • SCRIPT KILL
    杀死当前正在运行的 Lua 脚本。

  • SCRIPT LOAD script
    将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

Redis连接

主要用于连接redis服务

# 实例 演示客户端如何通过密码验证连接到 redis 服务,并检测服务是否在运行
AUTH "password"
OK

PING
PONG

基本命令

  • AUTH password: 验证密码是否正确
  • ECHO message: 打印字符串
  • PING: 查看服务是否运行
  • QUIT: 关闭当前连接
  • SELECT index: 切换到指定的数据库

Redis 服务器

主要用于管理redis服务

learn paper (Chinese)open in new window

高级部分

Redis 数据备份与恢复

使用SAVE命令创建当前数据库的备份。

# 语法|实例
redis 127.0.0.1:6379> SAVE
# 该命令在redis安装目录中创建dump.rdb文件

# 也可使用Bgsave命令,该命令在后台执行
redis 127.0.0.1:6379> BGSAVE
Background saving started

恢复数据

如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:

redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"

Redis 安全

可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。
详细介绍open in new window

性能测试

Redis 性能测试是通过同时执行多个命令实现的。

详细介绍open in new window

客户端连接、管道技术、分区

Java使用Redis

安装

开始使用前需要安装redis服务和Java redis驱动:

  • 下载jedis.jar驱动包,(确保下载最新驱动包)
  • 在classpath中包含该驱动

连接redis服务

// 实例
import redis.clients.jedis.Jedis;

public class RedisJava{
    public static void main(String[] args){
        //连接本地的redis服务
        Jedis jedis = new Jedis("locahost");
        System.out.println("连接成功!")//查看服务是否运行
        System.out.println("服务正在运行: " + jedis.ping);
    }
}
// String 实例
import redis.clients.jedis.Jedis;
 
public class RedisStringJava {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //设置redis 字符串数据
        jedis.set("runoobkey", "www.ok.com");
        //获取存储的数据并输出
        String strings = jedis.get(runoobkey);
        System.out.println("redis 存储的字符串为:" + strings);
    }
}
// List实例
import java.util.List;
import redis.clients.jedis.Jedis;

public class RedisListJava {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //存储数据到列表中
        jedis.lpush("site-list", "Runoob");
        jedis.lpush("site-list", "Google");
        jedis.lpush("site-list", "Taobao");
        // 获取存储的数据并输出
        List<String> list = jedis.lrange("site-list", 0 ,2);
        for(int i=0; i<list.size(); i++) {
            System.out.println("列表项为: "+list.get(i));
        }
    }
}
// redis java keys 实例

import java.util.Iterator;
import java.util.Set;
import redis.clients.jedis.Jedis;

public class RedisKeyJava{
    public static void main(String[] args){
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");

        //获取数据并输出
        Set<String> keys = jedis.keys("*");
        Iterator<String> it = keys.iterator();
        while(it.hasNext()){
            String key = it.next();
            System.out.println(key);
        }
    }
}
/**
输出:
runoobkey
site-list
*/

本文是基于RUNOOB-Redisopen in new window教程编写的学习笔记,只做个人知识库使用!首次发布于 YunLongBlogopen in new window, 作者 Laqudeeopen in new window ,转载请保留原文链接.