安装

centos7下安装

  1. 官网找到最新稳定版,复制下载地址

image-20200618095702216.png

  1. 下载 wget http://download.redis.io/releases/redis-6.0.5.tar.gz
  2. 解压,编译
  1. tar -zxvf redis-6.0.5.tar.gz
  2. cd redis-6.0.5/
  3. make

如果安装失败,出现很多gcc模块找不到,此时需要升级gcc后再安装

  1. yum install centos-release-scl scl-utils-build
  2. # 升级到gcc8
  3. yum install -y devtoolset-8-toolchain
  4. # 查看是否安装成功
  5. gcc -v
  6. # 再次执行make编译
  7. make

image-20200618100402664.png

  1. 启动 src/redis-server

image-20200618102047166.png

  1. 连接,新打开一个连接窗口,切换到redis目录 cd env/redis-6.0.5/,执行src/redis-cli

image-20200618102359868.png

连接完成后即可开始执行相关redis命令了

配置

远程连接

默认redis只监听本地ip的客户端连接请求,有时候我们需要远程连接redis,此时我们需要修改配置文件 vi redis.conf

  • 注释掉 bind ...
  • 修改 protected-mode no

image-20200618105055126.png

指定配置文件重启redis, src/redis-server ./redis.conf,现在就可以开始远程连接redis了

image-20200618105337235.png

后台启动

默认src/redis-server ./redis.conf命令启动redis会在当前终端运行,关闭终端则进程就结束了

修改 daemonize yes,重启redis,此时redis则会运行在后台(以linux守护进程的方式运行)

image-20200618111002754.png

配置文件说明

配置属性 配置示例 说明
port port 6379 启动监听端口
daemonize daemonize no 是否以守护进程启动,daemonize yes表示是
save save 900 1 控制什么时候将内存数据同步到磁盘rdb文件;例如”save 900 1“表示900秒内至少一个key发生变化(新增,修改,删除)则同步,save可配置多行记录,只要一个规则满足条件则同步
dbfilename dbfilename dump.rdb 持久化rbd文件的名称
dir dir ./ 数据库文件存放目录
requirepass requirepass 123456 指定redis连接的验证密码,redis6以后提供了ACL权限验证

….. 更多配置请查看配置文件

客户端连接

使用 Redis Desktop Manager 客户端连接 redis

image-20200618105545336.png

数据库说明

image-20200618111812984.png

  • db0 - db15代表redis的数据库,与mysql的数据库概念类似
  • 默认有16个数据库,可在配置文件中指定 databases 16
  • 每个数据库有独立的空间,不同数据库相同key并不会冲突
  • 可通过select命令手动指定数据库,例如select 1则切换到数据库db1

新建key

选择指定的数据库,点击新建按钮

image-20200618110024332.png

控制台

打开控制台,执行redis命令

image-20200618110616915.png

服务器命令

  • info 显示redis服务器的统计信息
  • select 数据库名称 选择数据库,默认选择数据库0
  • save 保存数据到磁盘
  • flushdb 删除当前数据库的所有key,请勿随意操作
  • dbsize 返回当前数据库的key数量
  • config get 配置属性名 获取配置属性的值

image-20200618151054390.png

  • config set 配置属性名 配置属性值 临时修改配置参数,无需重启,重启后修改失效

数据类型

参考文档:https://www.redis.net.cn/order/

String 字符串

  • 设置: set key value
  • 设置多个key-value: set key1 value1 key2 value2 ...
  • 设置值及过期时间: setex key seconds value ,以秒为单位设置过期时间; psetex 以毫秒为单位
  • 获取: get key
  • 获取多个key: mget key1 key2 key3 ...
  • 返回key的旧值,并设置新值: getset key newValue
  • 获取字符串长度: strlen key
  • 字符串追加: append key ,如果key存在,则追加,不存在则与 set 命令功能一样
  • 将存储的数字+1: incr key ,如果不是数字则会报错,如果不存在则默认为0,然后+1
    • 将存储的数字+num: incrby key num
    • 将存储的数字-1:decr key
    • 将存储的数字减去指定数字num: decrby key num
  • 获取key中字符串的子串: getrange key start end

List 列表

  • 在列表头部插入元素: lpush key value1 value2 ...
  • 在列表尾部插入元素: rpush key value1 value2 ...
  • 获取列表指定范围内的元素: lrange key start end
  • 获取列表长度: llen key
  • 通过索引获取列表元素: lindex key index ,index=0获取第一个元素,index=-1获取最后一个元素
  • 通过索引设置元素的值: lset key index value
  • 移除列表最后一个元素: rpop key
  • 移除列表第一个元素: lpop key
  • 移除列表元素: lrem key count value ,根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素
    • count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    • count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    • count = 0 : 移除表中所有与 value 相等的值

Hash 哈希表

  • 设置单个field-value对到哈希表中 hset key field value
  • 同时将多个 field-value (字段-值)对设置到哈希表中: hmset key field1 value1 field2 value2 ...
  • 获取哈希表中指定field的值: hget key field
  • 获取哈希表中所有field的value集合: hmget key field1 field2 ...
  • 获取哈希表中所有field, hkeys key
  • 获取哈希表中所有value, hvals key
  • 获取表中的所有field-value: hgetall key
  • 判断哈希表中field是否存在: hexists key field
  • 删除哈希表中的字段: hdel key field1 field2 ...
  • 获取哈希表中字段数量: hlen key

Set 集合

  • 向集合中添加元素, sadd key value1 value2 ... ,value重复则会被忽略
  • 获取集合所有元素, smembers key
  • 移除集合元素, srem key value1 value2 ...
  • 将集合a的元素移动到集合b中, smove set1 set2 set1_value ,将set1中的set1_value移动到set2中

Zset 有序集合

与 Set 类似,不重复的集合,但是保值有序,加入元素时会设置score值,越小排序越靠前

  • 添加元素, zadd key score value
  • 获取指定区间的元素(从小到大排序), zrange key start end
  • 获取指定区间的元素(从大到小排序), zrevrange key start end
  • 获取在指定score区间内的成员数量, zcount key min_score max_score
  • 移除元素, zrem key value

Java使用Redis

Jedis

依赖引入

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>3.3.0</version>
  5. </dependency>

连接测试

  1. package redis;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. import lombok.extern.java.Log;
  5. import org.junit.Test;
  6. import redis.clients.jedis.Jedis;
  7. import java.util.List;
  8. import java.util.Set;
  9. /**
  10. * @author yanhui@git.com.cn
  11. * @since 2020-06-18 15:27
  12. */
  13. @Getter
  14. @Setter
  15. @Log
  16. public class JedisTest {
  17. @Test
  18. public void startJedis() {
  19. try (Jedis jedis = new Jedis("ip***", 6379);) {
  20. // 密码认证
  21. jedis.auth("***");
  22. // 添加字符串
  23. jedis.set("s.t1", "yanhui");
  24. // 获取字符串
  25. String t1Value = jedis.get("s.t1");
  26. log.info(t1Value);
  27. // 列表list操作
  28. log.info("list操作");
  29. String listKey = "l.t1";
  30. jedis.lpush(listKey, "1", "2", "3", "4");
  31. List<String> lValue = jedis.lrange(listKey, 0, 3);
  32. lValue.forEach(System.out::println);
  33. log.info(jedis.llen(listKey).toString());
  34. // 集合set操作
  35. log.info("set操作");
  36. String setKey = "set.t1";
  37. jedis.sadd(setKey, "a", "b", "c");
  38. Set<String> setValue = jedis.smembers(setKey);
  39. setValue.forEach(System.out::println);
  40. // 有序集合zset操作
  41. log.info("zset操作");
  42. String zSetKey = "zset.t1";
  43. jedis.zadd(zSetKey, 100, "a");
  44. jedis.zadd(zSetKey, 200, "b");
  45. jedis.zadd(zSetKey, 300, "c");
  46. Set<String> zSetValue = jedis.zrange(zSetKey, 0, 3);
  47. zSetValue.forEach(System.out::println);// 结果根据权重大小score排序
  48. // 哈希表hset
  49. log.info("hset操作");
  50. String hSetKey = "hset.t1";
  51. jedis.hset(hSetKey, "k1", "v1");
  52. jedis.hset(hSetKey, "k2", "v2");
  53. jedis.hset(hSetKey, "k3", "v3");
  54. Map<String, String> hsetValue = jedis.hgetAll(hSetKey);
  55. hsetValue.forEach((k, v) -> {
  56. log.info(k);
  57. log.info(v);
  58. });
  59. // 删除key
  60. jedis.del("s.t1");
  61. jedis.del("l.t1");
  62. jedis.del("set.t1");
  63. jedis.del("zset.t1");
  64. jedis.del("hset.t1");
  65. }
  66. }
  67. }