本帖最后由 hmm1313133 于 2019-4-28 23:13 编辑



目录

目录

Redis简介及安装
Redis基础命令
Redis字符串
Redis哈希
Redis列表
Redis集合
Java操作Redis

前言

首先我们先介绍些Redis的基本概念,Redis是Nosql数据库,是一个key-value存储系统。虽然Redis是key-value的存储系统,但是Redis支持的value存储类型是非常的多,比如字符串、链表、集合、有序集合和哈希。同时Redis支持将数据存入内存,这极大的提高了Redis的数据存储性能,而在一个高负载的服务器中,我们必须思考如何让速度更快,此时将常用数据缓存将不失为一个良好的解决方案,在此,希望我的这篇Redis基础教程能给各位插件/MOD开发的大佬们带来一种新的数据存储思路及解决方案。
请回复/评分一下,您的支持是我最大的支持与鼓励!


Bone Studio





Redis简介及安装


Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。


Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。


Redis 数据类型

  • String(字符串)string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
  • Hash(哈希)string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
  • List(列表)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • Set(集合)Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
Redis 安装
Window 下安装
Linux 下安装







Redis基础命令

全局命令


Redis有五种数据结构,它们是键值对的值,对于键来说有一些通用的命令


1. keys *


此命令用来查看所有键。
下面使用set key value插入3对字符串类型的键值对
  1. 127.0.0.1:6379> set key1 value1
  2. OK
  3. 127.0.0.1:6379> set key2 value2
  4. OK
  5. 127.0.0.1:6379> set key3 value3
  6. OK
复制代码
keys *会将所有键输出
  1. 127.0.0.1:6379> keys *
  2. 1) "key3"
  3. 2) "key1"
  4. 3) "key2"
复制代码

2.dbsize

此命令会返回当前数据库中键的总数
  1. 127.0.0.1:6379> dbsize
  2. (integer) 3
复制代码

3.exist key

检查键是否存在,如果存在则返回1,不存在则返回0,可配合设置键的生存时间或过期时间来保存各种临时性认证数据等

4.del key [key ....]

删除一个现有建,如果建不存在则返回0,如果成功则返回删除的个数
  1. 127.0.0.1:6379> del key1
  2. (integer) 1
  3. 127.0.0.1:6379> del key1
  4. (integer) 0
  5. 127.0.0.1:6379> del key2 key3
  6. (integer) 2
复制代码

5.expire key seconds

Redis支持添加键值对过期时间,当超过过期时间后,会自动删除键值对
同时可以使用ttl key查询键值对的剩余过期时间
  1. 127.0.0.1:6379> expire key1 10
  2. (integer) 1
  3. 127.0.0.1:6379> ttl key1
复制代码

6.type key

查询键值对的数据类型,如果键值对不存在则返回null
  1. 127.0.0.1:6379> type key1
  2. string
复制代码






Redis字符串

常用命令


1.set key value [ex seconds] [px milliseconds] [nx|xx]

设置一个字符串类型的键值对

set命令有几个选项

  • ex 设置秒级过期时间
  • px 设置毫秒级过期时间
  • nx 必须键不存在才可以设置成功
  • xx 与nx相反,键必须存在才可设置成功

  1. 127.0.0.1:6379>  set key2 111 ex 10 nx
  2. OK
  3. 127.0.0.1:6379> ttl key2
  4. (integer) 5
复制代码

2.get key

获取值,没啥好说的,也懒得演示

3.mset key value [key value ...]

批量设置键值对
  1. 127.0.0.1:6379> mset a 1 b 2 c 3 d 4
  2. OK
复制代码

4.mget

批量获取值,如果键值对不存在则返回nil
  1. 127.0.0.1:6379> mget a b c d e
  2. 1) "1"
  3. 2) "2"
  4. 3) "3"
  5. 4) "4"
复制代码
批量操作命令可以有效提高开发效率,避免多次执行同一命令

5.incr key

incr命令用于对值做自增操作,返回结果分三种情况
  • 值不是整数,返回错误
  • 值是整数,返回自增后的结果
  • 建不存在,返回1
  1. 127.0.0.1:6379> exists zz
  2. (integer) 0
  3. 127.0.0.1:6379> incr zz
  4. (integer) 1
  5. 127.0.0.1:6379> incr zz
  6. (integer) 2
复制代码

不常用命令



1.append key value

append可以向字符串尾部追加值
  1. 127.0.0.1:6379> set test hello
  2. OK
  3. 127.0.0.1:6379> append test world
  4. (integer) 10
  5. 127.0.0.1:6379> get test
  6. "helloworld"
复制代码

2.strlen ley

返回字符串长度
  1. 127.0.0.1:6379> strlen test
  2. (integer) 10
复制代码

3.getset key value

返回当前值并设置一个新值
  1. 127.0.0.1:6379> getset test "hw"
  2. "helloworld"
  3. 127.0.0.1:6379> get test
  4. "hw"
复制代码

4.getrang key start end

获取部分字符串,start为起始位置,end为结束位置,此处不做演示

使用场景
  • 缓存功能
  • 计数
  • 共享数据







Redis哈希
简介

几乎所有编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希,字典。关联数组等。在Redis中,哈希类型是指键值本身又是一个键值对结果,例如value={{filed1,value1},.....,{filedN,valueN}

命令


1.hset key filed value


设置值,例如

  1. 127.0.0.1:6379> hset user:1 name tom
  2. (integer) 1
复制代码


2.hget key filed


获取值,例如

  1. 127.0.0.1:6379> hget user:1 name
  2. "tom"
复制代码


3.hdel key filed [filed ...]


删除值,可同时删除多个filed,返回删除数量

  1. 127.0.0.1:6379> hdel user:1 name
  2. (integer) 1
复制代码


4.hlen key


计算filed的个数

  1. 127.0.0.1:6379>  hmset user:1 name tom age 12 city beijing
  2. OK
  3. 127.0.0.1:6379> hlen user:1
  4. (integer) 3
复制代码


5.hmset key filed value [filed value ...]


批量设置filed-value,用法见上


6.hmget key filed [filed ....]


批量获取filed-value
  1. 127.0.0.1:6379> hmget user:1 name age city
  2. 1) "tom"
  3. 2) "12"
  4. 3) "beijing"
复制代码

7.hexists key filed

判断filed是否存在,存在返回1,不存在返回0
  1. 127.0.0.1:6379> hexists user:1 name
  2. (integer) 1
  3. 127.0.0.1:6379> hexists user:1 con
  4. (integer) 0
复制代码

8.hkeys key

获取指定key的所有filed
  1. 127.0.0.1:6379> hkeys user:1
  2. 1) "name"
  3. 2) "age"
  4. 3) "city"
复制代码

9.hvals key

获取所有value
  1. 127.0.0.1:6379> hvals user:1
  2. 1) "tom"
  3. 2) "12"
  4. 3) "beijing"
复制代码

10.hgetall key
获取所有filed-value
  1. 127.0.0.1:6379> hgetall user:1
  2. 1) "name"
  3. 2) "tom"
  4. 3) "age"
  5. 4) "12"
  6. 5) "city"
  7. 6) "beijing"
复制代码

使用场景
  • 缓存用户信息






Redis列表

简介


列表是原来储存多个有序的字符串,列表中的每个字符串被称为元素,在Redis中可以对列表两端插入(push)和弹出(pop),因此它可以充当栈和队列的角色

添加命令


1.rpush key value [value ...]

从右边插入元素
  1. 127.0.0.1:6379> rpush list a b d e
  2. (integer) 4
复制代码

2.lpush key value [value ...]

从左边插入元素

3.linsert key before|after pivot value

向某个元素前/后插入元素
  1. 127.0.0.1:6379> linsert list after b c
  2. (integer) 5
复制代码

查找命令

1.lrange key start end
获取指定范围内的元素列表,注意,索引下标将从0开始
  1. 127.0.0.1:6379> lrange list 0 4
  2. 1) "a"
  3. 2) "b"
  4. 3) "c"
  5. 4) "d"
  6. 5) "e"
复制代码

2.lindex key index
获取指定下标的元素,索引同样将从0开始

3.llen key
获取列表的长度

删除命令

1.lpop key
从左侧弹出元素
  1. 127.0.0.1:6379> lpop list
  2. "a"
复制代码

2.rpop key
从右侧弹出元素
  1. 127.0.0.1:6379> rpop list
  2. "e"
  3. 127.0.0.1:6379> lrange list 0 2
  4. 1) "b"
  5. 2) "c"
  6. 3) "d"
复制代码

3.lrem key count value
Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值
count = 0 : 移除表中所有与 VALUE 相等的值
  1. redis> RPUSH mylist "hello"
  2. (integer) 1
  3. redis> RPUSH mylist "hello"
  4. (integer) 2
  5. redis> RPUSH mylist "foo"
  6. (integer) 3
  7. redis> RPUSH mylist "hello"
  8. (integer) 4
  9. redis> LREM mylist -2 "hello"
  10. (integer) 2
  11. redis> LRANGE mylist 0 -1
  12. 1) "hello"
  13. 2) "foo"
复制代码

4.ltrim key start end
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
  1. redis 127.0.0.1:6379> RPUSH mylist "hello"
  2. (integer) 1
  3. redis 127.0.0.1:6379> RPUSH mylist "hello"
  4. (integer) 2
  5. redis 127.0.0.1:6379> RPUSH mylist "foo"
  6. (integer) 3
  7. redis 127.0.0.1:6379> RPUSH mylist "bar"
  8. (integer) 4
  9. redis 127.0.0.1:6379> LTRIM mylist 1 -1
  10. OK
  11. redis 127.0.0.1:6379> LRANGE mylist 0 -1
  12. 1) "hello"
  13. 2) "foo"
  14. 3) "bar"
复制代码

修改命令


1.lset key index newValue

修改指定索引下标的元素

阻塞命令
阻塞命令会根据设置的阻塞时间,等待相应的时间后返回数据,这里不多加叙述,有兴趣的读者可以参考https://www.runoob.com/redis/lists-brpop.html

使用场景
  • 消息队列
  • 文章列表






Redis集合

简介

集合类型也是用来保存多个字符串类型的数据,但和列表不同的是,集合中不允许有重复元素,并且集合的元素是无序的


集合内命令



1.sadd key element [element ...]

添加元素,返回结果为添加成功的元素个数
  1. 127.0.0.1:6379> sadd set value1 value2 value3
  2. (integer) 3
复制代码

2.srem key element [element ...]

删除元素,返回结果为删除成功的元素个数

3.scard key
计算元素个数
  1. 127.0.0.1:6379> scard set
  2. (integer) 3
复制代码

4.sismember key value

判断元素是否在集合中,是返回1,否返回0
  1. 127.0.0.1:6379> sismember set value1
  2. (integer) 1
  3. 127.0.0.1:6379> sismember set value4
  4. (integer) 0
复制代码

5.srandmember key [count]
随机从集合中返回count个元素
  1. 127.0.0.1:6379> srandmember set 2
  2. 1) "value1"
  3. 2) "value2"
  4. 127.0.0.1:6379> srandmember set 2
  5. 1) "value3"
  6. 2) "value2"
复制代码

6.spop key [count]
随机从集合中返回count个元素并将返回的元素删除

7.smembers key
获取所有元素
  1. 127.0.0.1:6379> smembers set
  2. 1) "value3"
  3. 2) "value1"
  4. 3) "value2"
复制代码

集合间命令

现在有两个集合user:1:follow和user:2:follow
  1. 127.0.0.1:6379> sadd user1:follow it music his sports
  2. (integer) 4
  3. 127.0.0.1:6379> sadd user2:follow it news ent sports
  4. (integer) 4
复制代码

1.sinter key [key ...]
求多个集合的交集
  1. 127.0.0.1:6379> sinter user1:follow user2:follow
  2. 1) "sports"
  3. 2) "it"
复制代码

2.sunion key [key ...]
求多个集合的并集
  1. 127.0.0.1:6379> sunion user1:follow user2:follow
  2. 1) "music"
  3. 2) "sports"
  4. 3) "ent"
  5. 4) "his"
  6. 5) "news"
  7. 6) "it"
复制代码

3.sdiff key [key ...]
求多个集合的差集
  1. 127.0.0.1:6379> sdiff user1:follow user2:follow
  2. 1) "music"
  3. 2) "his"
复制代码

使用场景
  • 标签







Java操作Redis

安装

开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java
如何安装 Java redis 驱动?
首先你需要下载驱动包 下载 jedis.jar,确保下载最新驱动包
在你的 classpath 中包含该驱动包
应某大佬意见附maven支持配置:
  1. <dependency>
  2.      <groupId>redis.clients</groupId>
  3.      <artifactId>jedis</artifactId>
  4.      <version>3.1.0-m1</version>
  5.      <scope>provided</scope>
  6. </dependency>
复制代码

连接到Redis

  1. import redis.clients.jedis.Jedis;

  2. public class RedisJava {
  3.           public static void main(String[] args) {
  4.           //连接本地的 Redis 服务
  5.           Jedis jedis = new Jedis("localhost");
  6.           System.out.println("连接成功");
  7.           //查看服务是否运行
  8.           System.out.println("服务正在运行: "+jedis.ping());
  9.           }
  10. }
复制代码


Redis Java String(字符串) 实例
  1. import redis.clients.jedis.Jedis;

  2. public class RedisStringJava {
  3.           public static void main(String[] args) {
  4.           //连接本地的 Redis 服务
  5.           Jedis jedis = new Jedis("localhost");
  6.           System.out.println("连接成功");
  7.           //设置 redis 字符串数据
  8.           jedis.set("hello", "redis");
  9.           // 获取存储的数据并输出
  10.           System.out.println("redis 存储的字符串为: "+ jedis.get("hello"));
  11.           }
  12. }
复制代码

Redis Java List(列表) 实例
  1. import java.util.List;
  2. import redis.clients.jedis.Jedis;

  3. public class RedisListJava {
  4.     public static void main(String[] args) {
  5.         //连接本地的 Redis 服务
  6.         Jedis jedis = new Jedis("localhost");
  7.         System.out.println("连接成功");
  8.         //存储数据到列表中
  9.         jedis.lpush("site-list", "Baidu");
  10.         jedis.lpush("site-list", "Google");
  11.         jedis.lpush("site-list", "Taobao");
  12.         // 获取存储的数据并输出
  13.         List<String> list = jedis.lrange("site-list", 0 ,2);
  14.         for(int i=0; i<list.size(); i++) {
  15.             System.out.println("列表项为: "+list.get(i));
  16.         }
  17.     }
  18. }
复制代码






[groupid=1306]Bone Studio[/groupid]