3v+3高
海量
多样
实时

高并发
高可扩
高性能

简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

安装

Redis支持windows和linux。但是官方推荐使用linux系统,而且windows系统版本的redis也已经停止更新了。这里我也推荐使用linux系统安装,并且讲述安装方式。
官网下载https://redis.io/
下载之后,上传到linux系统中,使用tar -zxvf 命令解压缩,此时目录中会出现一个redis目录(我建议大家将解压包移动到opt目录下)
image.png
如果没有安装java环境的和gcc环境,请先安装
[root@localhost opt]# cd redis-6.2.2/ 进入redis目录
image.png
没有安装目录下是没有src目录的。我们可以看到Makefile文件,学过linux的都知道这是批处理文件,所以使用make命令安装
image.png
第一次安装会有一点点漫长,因为需要编译、下载许多文件,出现最后一句话就成功了
执行 make install
接下来我们前往 /usr/local/bin 目录,用户安装的软件都在这个目录下
image.png
其中我们看到redis-cli等就是刚才make install安装的,不执行则没有
接下来我们配置redis ,我们在此目录下新建一个文档,用来存放配置文件,接下来将 /opt/redis/redis.config文件拷贝到此目录下。(这样做的目的是我们不用修改源配置文件)
image.png
配置文件中我只用修改 daemonize no 字段,默认是no ,我们修改为yes,这样redis服务在启动后就可以自动挂到后台运行。修改之后,回到 /usr/local/bin目录下
image.png
我们可以看到redis-server这个可执行文件
使用 redis-server zconfig/redis.config 指定配置文件启动程序。
redis最新本版,没有提示。但是我们可以查看进程
ps -ef|grep redis
image.png
说明服务启动成功
接下来我们简单使用redis
使用 redis-cli -p 6379 然后 ping
image.png
出现pong说明成功,接下来我们添加键值对
image.png
关闭redis服务,我们使用命令 shutdown
image.png
ctrl+c只是挂到后台,并没有关闭,此时我们查看进程,发现redis服务已经关闭。
image.png

基本用法

redis有16个数据库,通过select切换

redis端口号6379的小故事
6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字。

五大数据类型

官网文档
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
全文翻译
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。Redis提供诸如字符串、哈希、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流等数据结构。Redis具有内置的复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。

Redis-key

基本常用命令 使用set 添加数据,get获取数据,flushdb清空数据库,flushall清空全部数据库内容,dbsize获取数据条数 EXIXTS key 判断是否存在 type key 判断类型 move key index 删除 expire key time 设置过期时间

String

基本命令 127.0.0.1:6379> get name (nil)
127.0.0.1:6379> set name hello //设置值 OK 127.0.0.1:6379> get name //获取值 “hello” 127.0.0.1:6379> append name ,redis //从字符串末尾添加新字符 (integer) 11 127.0.0.1:6379> get name “hello,redis” 127.0.0.1:6379> strlen name //获取字符串长度 (integer) 11 127.0.0.1:6379> set views 0
OK 127.0.0.1:6379> get views “0” 127.0.0.1:6379> incr views //数字自加 (integer) 1 127.0.0.1:6379> get views “1” 127.0.0.1:6379> decr views //数字自减 (integer) 0 127.0.0.1:6379> get views “0” 127.0.0.1:6379> incrby views 10 //设置步长自加 (integer) 10 127.0.0.1:6379> get views “10” 127.0.0.1:6379> decrby views 5 //设置步长自减 (integer) 5 127.0.0.1:6379> get views “5” 127.0.0.1:6379> getrange name 0 5 //获取指定范围的字符 “hello,” 127.0.0.1:6379> getrange name 0 -1 //-1 获取全部字符等同于 , get key “hello,redis” 127.0.0.1:6379> setrange name 10 xxx //替换指定位置的字符 (integer) 13
127.0.0.1:6379> get name “hello,redixxx” 127.0.0.1:6379> setex name1 60 111 // set with expire (设置值并设置过期时间) OK 127.0.0.1:6379> get name1 “111”

127.0.0.1:6379> ttl name1 //ttl获取key的过期时间 (integer) 32 127.0.0.1:6379> get name1 (nil) 127.0.0.1:6379> setnx name1 555 //set if not exises 如果不存在key则设置key (integer) 1 127.0.0.1:6379> get name1 “555” 127.0.0.1:6379> mset k1 v1 k2 v2 //设置多个值 OK 127.0.0.1:6379> mget k1 k2 //获取多个值 1) “v1” 2) “v2” 127.0.0.1:6379> msetnx k1 v0 k3 v3 //如果不存在则设置多个值,原子操作,所以这里 k3设置值失败 (integer) 0 127.0.0.1:6379> mget k1 k2 k3 1) “v1” 2) “v2” 3) (nil) 127.0.0.1:6379> getset v3 555 //先获取值在设置值 (nil) 127.0.0.1:6379> get v3 “555”

List(列表)

127.0.0.1:6379> Lpush list zhangsan //从左边插入新的元素 rpush list zhangsan //从右边插入新的元素 (integer) 1 127.0.0.1:6379> lpush list lisi (integer) 2 127.0.0.1:6379> lrange list 0 -1 //查看元素 1) “lisi” 2) “zhangsan” 127.0.0.1:6379> rpop list 1 //从右边弹出元素 lpop 从左边弹出元素 后面的数字代表弹出几个 1) “wangwu” 127.0.0.1:6379> lrange list 0 -1 1) “zhangsan” 127.0.0.1:6379> lindex list 0 //获取指定下标的值 “wangwu” 127.0.0.1:6379> llen list //获取列表的长度 (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) “lisi” 2) “wangwu” 3) “lisi” 4) “zhangsan” 127.0.0.1:6379> lrem list 2 lisi //删除重复元素 (integer) 2 127.0.0.1:6379> lrange list 0 -1 1) “wangwu” 2) “zhangsan” 127.0.0.1:6379> rpoplpush list list2 //将 原列表右边第一个元素移动到新的列表中 “zhangsan” 127.0.0.1:6379> lrange list 0 -1 1) “wangwu” 127.0.0.1:6379> lset list 0 lisi //更新指定位置的值 OK 127.0.0.1:6379> lrange list 0 -1 1) “lisi” 127.0.0.1:6379> lrange list 0 -1 1) “zhangsan” 2) “wangwu” 127.0.0.1:6379> linsert list before zhangsan lisi // 插入新值到某个元素之前或之后 (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) “lisi” 2) “zhangsan” 3) “wangwu” 127.0.0.1:6379> ltrim list 1 2 //截取列表,留下截取的元素 OK 127.0.0.1:6379> lrange list 0 -1 1) “zhangsan” 2) “wangwu”

SET

127.0.0.1:6379> sadd set hello nihao //添加元素 (integer) 2 127.0.0.1:6379> smembers set //获取所有元素 1) “nihao” 2) “hello” 127.0.0.1:6379> sismember set nihao // (integer) 1 127.0.0.1:6379> scard set //获取set中的元素个数 (integer) 3 127.0.0.1:6379> srandmember set //随机获取 “hello” 127.0.0.1:6379> srandmember set “nihao” 127.0.0.1:6379> srem set yuepao //删除指定元素 (integer) 1 127.0.0.1:6379> spop set //随机删除 “hello” 127.0.0.1:6379> smove set set1 1 //移动元素到另外的集合 (integer) 1 127.0.0.1:6379> smembers set 1) “2” 2) “3” 3) “4” 4) “5” 5) “6” 6) “7” 7) “8” 8) “9” 127.0.0.1:6379> smembers set1 1) “1” 127.0.0.1:6379> sdiff set set1 //获取两个集合的差集 sinter set set1 //两个集合的交集 127.0.0.1:6379> sunion set set1 //两个集合的并集

Hash

127.0.0.1:6379> hset hash name zs age 17 //添加值 (integer) 2 127.0.0.1:6379> hget hash name “zs” 127.0.0.1:6379> hget hash age // 获取值 “17” 127.0.0.1:6379> hmget hash name age 1) “zs” 2) “17” 127.0.0.1:6379> hmset hash sex boy height 180 //设置多个值 OK 127.0.0.1:6379> hmget hash name sex height age //获取多个值 1) “zs” 2) “boy” 3) “180” 4) “17” 127.0.0.1:6379> hgetall hash1) “name” //获取所有键和值 2) “zs” 3) “age” 4) “17” 5) “sex” 6) “boy” 127.0.0.1:6379> hkeys hash //获取所有键 1) “name” 2) “age” 3) “sex” 127.0.0.1:6379> hvals hash //获取所有值 1) “zs” 2) “17” 3) “boy” hincrby hash age 1 //自增自减 (integer) 18 127.0.0.1:6379> hsetnx //如果不存在则增加元素

Zset(有序集合)

127.0.0.1:6379> zadd name 1 xiaohong 2 lisi 3 wangwu //添加
(integer) 3
127.0.0.1:6379> zrange name 0 -1 //便利所有
1) “xiaohong”
2) “lisi”
3) “wangwu”
127.0.0.1:6379> zrangebyscore name -inf +inf //由低到高排序
1) “xiaohong”
2) “lisi”
3) “wangwu”
ZCOUNT name 1 2 //获取指定区间的成员数量

特殊数据类型

不写

Redis的基本事务操作

redis命令保存原子性,但是事务没有原子性、隔离性

事务的本质 : 一组命令的集合

  • 开启事务
    • multi
  • 命令入队

  • 执行事务
    • exec
  • 放弃事务
    • discard

      redis监视数据

添加监视 watch
取消监视 unwatch

Jedis

使用java操作redis

Jedis是redis推荐使用的java连接开发工具

连接远程redis服务

  • 修改redis配置文件
    • image.png改为no
    • image.png注释或改为这个
    • 设置密码
  • 开放防火墙端口

    • firewall-cmd —add-port=6379/tcp —permanent
    • 重启防火墙 systemctl restart firewalld

      Springboot整合redis

      添加依赖
      基本配置

      1. spring:
      2. redis:
      3. password: 123456
      4. host: 192.168.47.129

      自定义序列化类(否则会导致key值被转义) ```java 固定模板 @Configuration public class redisconfig {

      @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectJackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setValueSerializer(stringRedisSerializer); template.setHashValueSerializer(stringRedisSerializer); template.afterPropertiesSet(); return template; } }

      1. 编写redis操作工具类
      2. ```java
      3. //开发中。。。

      redis基本配置文件

      image.png配置多个配置文件
      image.png连接的ip地址
      image.png默认的接口,保护模块为yes无法远程连接
      image.png yes可以让redis服务后台进行
      image.png进程文件,以及日志等级和日志文件的存储路径

      日志分为 debug verbose notice warning

      image.pngredis默认有16个数据库
      image.png是否显示logo
      image.png设置密码,为了安全建议设置
      image.png最大客户端
      image.png最大内存容量
      image.png内存满了处理策略
      image.png默认不开启aof持久化
      image.png同步策略,每秒同步

      持久化

      rdb

      1. save 3600 1
      2. # save 300 100
      3. # save 60 10000
      4. 默认持久化文件名 dump.rdb
      5. 当满足持久化规则,则写入一次dump.rdb文件
      6. 或者flushall也会生成dump.rdb文件
      7. 关闭服务会生成dump.rdb文件
      8. 当下一次服务启动,会读取dump.rdb文件同步数据,dump.rdb文件存在服务启动目录
      9. 优点:
      10. 适合大规模数据恢复
      11. 对数据的完整性要求不高
      12. 缺点:
      13. 备份具有时间间隔,如果出现脱机最后修改的数据会丢失
      14. 会占用内存资源

      aof

      1. appendonly no //默认不开启
      2. # The name of the append only file (default: "appendonly.aof")
      3. appendfilename "appendonly.aof" //文件名
      4. appendonly.aof 以日志级别记录所有操作命令
      5. 优点:
      6. 每一次修改都同步
      7. 数据完整性高,只会丢失一秒的数据
      8. 缺点:
      9. 文件大小远远大于rdb
      10. 修复速度慢

      image.png修复工具

      发布订阅

      订阅端

      1. SUBSCRIBE xiangyaofei 订阅的频道

      发送端

      1. PUBLISH xiangyaofei helloworld 频道 + 消息

      主从复制

      主机负责写入,从机只能读取

      SLAVEOF host port //使用命令设置主从关系

      1. //从机
      2. 127.0.0.1:6380> info replication
      3. # Replication
      4. role:slave
      5. master_host:127.0.0.1
      6. master_port:6379
      7. master_link_status:down
      8. master_last_io_seconds_ago:-1
      9. master_sync_in_progress:0
      10. slave_repl_offset:1
      11. master_link_down_since_seconds:-1
      12. slave_priority:100
      13. slave_read_only:1
      14. replica_announced:1
      15. connected_slaves:0
      16. master_failover_state:no-failover
      17. master_replid:ea4ccc95a7906709baf4e90311cad46549991e30
      18. master_replid2:0000000000000000000000000000000000000000
      19. master_repl_offset:0
      20. second_repl_offset:-1
      21. repl_backlog_active:0
      22. repl_backlog_size:1048576
      23. repl_backlog_first_byte_offset:0
      24. repl_backlog_histlen:0
      25. 主机
      26. 127.0.0.1:6379> info replication
      27. # Replication
      28. role:master
      29. connected_slaves:0
      30. master_failover_state:no-failover
      31. master_replid:a77fe8ff8461900b39044ea01098e84bc45b2787
      32. master_replid2:0000000000000000000000000000000000000000
      33. master_repl_offset:0
      34. second_repl_offset:-1
      35. repl_backlog_active:0
      36. repl_backlog_size:1048576
      37. repl_backlog_first_byte_offset:0
      38. repl_backlog_histlen:0
      39. 这种命令的配置方式,在服务重启后关系就不存在了

      image.png
      也可以使用配置文件配置
      image.png
      当从机上线,我们就可以看到

      1. //主机信息
      2. 127.0.0.1:6379> info replication
      3. # Replication
      4. role:master
      5. connected_slaves:1
      6. slave0:ip=127.0.0.1,port=6380,state=online,offset=42,lag=0
      7. master_failover_state:no-failover
      8. master_replid:80e93202cfdce6832e4fc3e1992d804a10d2946b
      9. master_replid2:0000000000000000000000000000000000000000
      10. master_repl_offset:42
      11. second_repl_offset:-1
      12. repl_backlog_active:1
      13. repl_backlog_size:1048576
      14. repl_backlog_first_byte_offset:1
      15. repl_backlog_histlen:42
      16. //从机信息
      17. 27.0.0.1:6380> info replication
      18. # Replication
      19. role:slave
      20. master_host:127.0.0.1
      21. master_port:6379
      22. master_link_status:up
      23. master_last_io_seconds_ago:10
      24. master_sync_in_progress:0
      25. slave_repl_offset:196
      26. slave_priority:100
      27. slave_read_only:1
      28. replica_announced:1
      29. connected_slaves:0
      30. master_failover_state:no-failover
      31. master_replid:80e93202cfdce6832e4fc3e1992d804a10d2946b
      32. master_replid2:0000000000000000000000000000000000000000
      33. master_repl_offset:196
      34. second_repl_offset:-1
      35. repl_backlog_active:1
      36. repl_backlog_size:1048576
      37. repl_backlog_first_byte_offset:1
      38. repl_backlog_histlen:196
      39. 主机不掉线的情况下,会实时监控从机
      40. 而且主机写入数据,从机会同步一份,当掉线的从机上线,从机会先同步主机数据
      41. 主机掉线从机不会自动选择主机,而是等待主机上线
      42. 当主机实实在在的死掉,为了服务能够继续,我们应该在redis集群中重新选择主机,这种机制 叫做哨兵模式

      哨兵模式

      正式项目,存在多个哨兵,这里为了节约资源,只设置一个哨兵

      1. 哨兵可以监视主机是否故障,如果一定时间无心跳,则哨兵通过投票选出新的主机,原主机上线,自动变为从机
      2. 编写配置文件 sentinel.conf
      3. sentinel monitor myredis 127.0.0.1 6379 1
      4. 优点:
      5. 系统可用性高
      6. 缺点:
      7. 不利于扩容