redis持续学习中

概述

  1. redis速度快

redis读写速度可达10w/秒,受内存影响。因为redis是将数据存放在内存中的。

redis使用c语言实现

redis是单线程的,避免了多线程竞争资源

  1. redis基于键值对,支持多种数据结构

字符串(String)、列表(list)、集合(set)、有序集合(zset)、哈希(hash)、位图(Bitmaps)、HyperLogLog…

  1. 多种功能

键过期,用来实现缓存

发布订阅,用来实现消息系统

Lua脚本,用来创造更多redis命令

具有事务

流水线功能,客户端可以将一批命令一次性传到Redis,减少网络开销

  1. 简单稳定

  2. 持久化

redis支持持久化,持久化到rdb或aof中

Memcache不支持持久化

  1. redis支持主从复制

提供相同的副本,主库写,从库可读,可配置多个从库。配置哨兵主库挂掉根据投票选一个从库做为主库

  1. redis高可用分布式

CentOS7安装redis(redis版本奇数为非稳定版,偶数为稳定版)

#redis是基于c开发需要先安装gcc
$ yum install -y gcc-c++
#从官网拉取安装包
$ wget http://download.redis.io/releases/redis版本
#解压
$ tar -zxvf 下载的redis压缩包
#编译:进入解压后的redis目录,执行下面命令
$ make
#安装
$ make PREFIX=/usr/local/redis install
#安装后会在/usr/local/redis下生成一个bin目录,里面有redis相应的启动项

redis配置(linux:redis.conf;windows:redis.windows.conf)

#linux
#从redis安装目录(也就是解压后的目录里将redis.conf拷贝到/usr/local/redis/bin/下
$ cp redis.conf /usr/local/redis/bin/

redis配置详解

#1.redis默认不是以守护进程运行的,可以通过配置进行修改,默认为no,yes为以守护进程运行
daemonize no

#2.redis以守护进程运行时默认会吧pid写入到/var/run/redis/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis_6379.pid

#3.redis默认端口为6379,可以通过配置port配置端口
port 6379

#4.redis默认绑定本地主机地址,只有本地可以访问redis,可以通过配置文件修改
bind 127.0.0.1

#5.当客户端闲置多长时间后关闭连接,如果指定0,表示关闭该功能,默认0
timeout 0

#6.指定redis的日志级别,redis共支持四个级别:debug、verbose、notice、warning,默认为notice
loglevel notice

#7.日志记录方式,默认为标准输出,如果配置redis为守护进程运行,而这里有配置日志记录方式为标准输出,则日志会发送给/dev/null
logfile ""

#8.redis默认支持16个数据库,可以通过配置修改数据库数量,可以使用SELECT <dpid>命令在连接上指定数据库id
databases 16

#9.指定redis多久做一次持久化操作,可以配合多个条件“save <秒> <key更改次数>”,默认配置文件提供三个条件为:
# 指的是rdb方式存储,也就是数据文件存储。还可以设置为aof日志存储方式(只会存set操作,get不存)
# 服务器不宕机,删除rdb文件后,对应的数据还存在(因为redis数据保存在内存中,rdb文件或aof文件只是redis将内存数据持久化到硬盘中)。
# 如果服务器宕机时,某些数据没有达到数据持久化操作的时间及标准时,这部分数据就会丢失。
save 900 1 #900秒有一个key更改做一次持久化
save 300 10 #300秒有十个key更改做一次持久化
save 60 10000 #60秒有一万个key更改做一次持久化

#10.指定redis持久化到本地时是否压缩数据,默认为yes。redis采用LZF压缩,如果为了节省CPU时间,可以关闭该项,但是会导致数据量变得巨大
rdbcompression yes

#11.指定本地数据库文件名,默认dump.rdb,可以进行配置修改
dbfilename dump.rdb

#12.指定本地数据库存放的目录,默认当前目录
dir ./

#13.主从复制相关:replicaof <masterip> <masterport>和slaveof <masterip> <masterport>效果相同,都是设置本机为slave(从)服务时,设置master(主)服务的ip及端口,在redis启动时,它会从master进行数据同步。
replicaof <masterip> <masterport>

#14..当master(主)服务设置了密码保护时,slave(从)连接时的密码
masterauth <master-password>

#15.设置redis连接密码,如果配置了连接密码,客户端在连接redis时就需要通过AUTH <password> 命令提供密码,默认关闭
requirepass foobared

#16.设置客户端最大连接数,默认无限制。redis可以打开最大客户端数是redis进程可以打开最大的描述符数,如果设置了maxclinets 0,表示不设置限制。如果客户端连接数达到限制时,redis会关闭新连接并向客户端返回错误:max number of client reached错误信息
maxclients 10000

#17设置redis最大内存限制,redis启动时会将数据加载到内存中,如果内存已满会尝试清除已经到期或即将到期的key,当此方法执行后内存还能达到最大内存限制,那么redis就会限制写操作,但是还可以正常读取。redis新的vm机制,会将key存放内存,value存放swap区
maxmemory <bytes> #建议:如果内存为1G 那么给redis内存为256-512M,注意单位

#18 redis会时长存储大量的数据到内存中,因此对内存的要求较高,即使采用集群部署来扩容,也要及时整理内存,维护系统新能(如果一直新增数据,内存会很快占满),在redis提供两种解决方案:
1.设置数据超时时间
2.采用LRU算法动态将不用的数据删除。内存管理的一种页面置换算法,对于在内存中又不常用的数据库(内存块)叫做LRU,操作系统会根据哪种数据数据LRU而将数据移除内存用来加载另外的数据
# volatile-lru -> 删除设定了超时时间中最不常用的数据.
# allkeys-lru -> 查询所有key中最不常用的数据进行删除,这是应用最广的策略.
# volatile-lfu -> 从所有设置了超时时间的数据中删除使用频率最少的key.
# allkeys-lfu -> 从所有数据中删除使用频率最少的key.
# volatile-random -> 随机删除设置了超时时间的数据.
# allkeys-random -> 查询所有key后随即删除key.
# volatile-ttl -> 查询所有设置了超时时间的key,然后排序,删除快要到期的key.
# noeviction -> 不删除数据,内存溢出报错(默认).
maxmemory-policy noeviction

#19 指定是否每次执行更新操作进行日志的记录,默认为no。redis在默认会把数据写入到磁盘中,但是写入磁盘依赖于save的配置,如果没有达到要求服务器就出现问题,那么数据就会丢失。该操作就为aof日志
appendonly no
#指定aof更新日志的文件名,默认appendonly.aof
appendfilename "appendonly.aof"
#指定日志更新的条件,默认appendfsync everysec
# appendfsync always	表示每次更新后都会调用fsync()将内存数据写到磁盘(由于每次都会更新所以效率低,但安全)
appendfsync everysec	#每隔一秒调用一次,将内存数据写入到磁盘。但是进行写操作时调用fsync超过一秒,那么redis就会采用延迟fsync策略再等一秒钟再调用fsync进行写入,这一次不管多久都会执行。这时由于fsync时文件描述符会被阻塞,所以当前写操作会被阻塞。redis默认使用该配置(中)
# appendfsync no	#redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上(快)

#指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no

#虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap

#将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0

#Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32

#设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728

#设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4

#设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes

#指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512

#指定是否激活重置哈希,默认为开启
activerehashing yes

#指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf

Redis中内存维护策略

# redis数据存放在内存中,如果数据量不断增大,就会出现内存及性能问题。就算使用集群部署动态进行扩容,也应该及时处理无用数据,提升性能。
解决一:设置数据超时时间(命令)
# 除字符符串外使用expire设置超时时间,字符串使用setex。如果不设置超时时间,那么key就为永久有效。如果设置了超时时间,但是又想设为永久有效,可以通过persist key来设置
# 执行命令expire key time,单位为秒。ttl为查看指定键的距离超时时间还有多少秒,如果超时或不存在返回-2,ttl返回-1为永久有效
# 使用场景:验证码、token登录超时等
$ set user:name person1
$ expire user:name 10
$ get user:name
$ ttl user:name
# 字符串需要单独使用setex(String key,int seconds,String value)进行设置
$ setex user:age 10 "100"
$ get user:age
$ ttl user:age
解决二:使用LRU算法动态将不用的数据删除(配置文件)
# redis.conf配置
# volatile-lru -> 删除设定了超时时间中最不常用的数据.(常用)
# allkeys-lru -> 查询所有key中最不常用的数据进行删除,这是应用最广的策略.(常用)
# volatile-lfu -> 从所有设置了超时时间的数据中删除使用频率最少的key.(不常用)
# allkeys-lfu -> 从所有数据中删除使用频率最少的key.(不常用)
# volatile-random -> 随机删除设置了超时时间的数据.(不常用)
# allkeys-random -> 查询所有key后随即删除key.(不常用)
# volatile-ttl -> 查询所有设置了超时时间的key,然后排序,删除快要到期的key.(不常用)
# noeviction -> 不删除数据,内存溢出报错(默认).(不常用)
maxmemory-policy noeviction

redis配置启动

  1. 修改进程为守护进程(是为了让redis在后台可以运行) “daemonize yes”
  2. 注释bind本地地址(是为了通过远程可以访问) “#bind 127.0.0.1”
  3. 添加密码(想要java访问就需要密码) “requirepass 密码”
  4. 启动redis需要使用./redis-server 加上配置文件,如我的配置文件和redis-server是同目录可以使用"./redis-server ./redis.conf"
  5. redis设置密码后登录:redis-cli -h 主机 -p 端口 -a 密码 如果本地,那么启动客户端后可以使用"auth 密码"登录

redis注意事项

#redis关闭时如果使用kill命令就可能会丢失最近保存数据,如果使用shutdown命令就会先持久化数据到本地然后关闭redis

redis命令

字符串
# 1.设置一个key它的值为value;ex seconds为设置秒级过期时间,px milliseconds为毫秒级过期时间,nx为key必须不存在,存在添加失败;xx为key必须存在,否则更新失败。例:设置name的值为xiaoming,过期时间为10秒,必须不存在 ->set name xiaoming ex 10 nx
$ set key value [ex seconds] [px milliseconds] [nx|xx]
# 2.设置一个key它的值为value,且过期时间为指定毫秒。例:设置name值为xiaoming的过期时间为10秒 ->setex name 10 xiaoming
$ setex key seconds value
# 3.如果key存在,那么添加失败,如果key不存在,那么添加成功
$ setnx key value
# 4.


#select可以切换redis数据库,下标从0开始
$ select 0
#1.删除一个或多个key
$ del key
#2.添加一个key
$ set key value
#3.序列化给定key
$ dump key
#4.查看所有key
$ keys *
#5.检查key是否存在
$ exists key
#6.为给定key设置超时时间,单位秒
$ expire key 秒
#7.为给定key设置超时时间,单位毫秒
$ pexpire key 毫秒
#8.查看指定key距离过期还剩多少秒(key过期或不存在返回-2,如果过期时间为永久不过期则返回-1)
$ ttl key
#9.查看指定key距离过期时间还剩多少毫秒(key过期或不存在返回-2,如果过期时间为永久不过期则返回-1)
$ pttl key
#10.移除key的过期时间,将key永久保存
$ persist key
#11.根据通配符查询key,*代表所有,?代表任意一个字符
$ keys 通配符
#12.随即返回一个key
$ randomkey
#13.修改key的名称
$ rename 旧key名 新key名
#14.移动当前数据库key到指定数据库中
$ move key 数据库下标(从0开始)
#15.查看key的类型
$ type key
# ---------------------------------------------------list
# ***使用场景***
# 热点新闻,排行榜等,定时从数据库查出来更新添加到list中,查list,如果没有查数据库放到list
#1.将一个或多个值插入到列表头部,从左侧添加
$ lpush key value1 [value2]
#2.在列表中添加一个或多个值,从右侧添加
$ rpush key value1 [value2]
#3.将一个值插入到已存在的列表头部,如果列表不存在,操作无效
$ lpushx key value
#4.将一个值插入到列表尾部,如果列表不存在,操作无效
$ rpushx key value
#5.获取列表长度
$ llen key
#6.通过索引获取列表元素
$ lindex key index
#7.获取列表指定范围内的元素,列表是双向的,可以通过0获取第一个元素,1获取第二,可以通过-1获取最后一个元素,-2倒数第二
$ lrange key start stop
#8.移除并获取列表的第一个元素(从左侧删除)
$ lpop key
#9.移除列表的最后一个元素,返回被移除的元素(从右侧删除)
$ rpop key
#10.移除并获取列表第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可移除元素为止,timeout如果不设置就会一直阻塞,直到发现移除元素为止
$ blpop key1 [key2] timeout
#11.移除并获取列表最后一个元素,如果列表没有就进入阻塞状态,直到超时或者发现可移除元素。如果未设置timeout并没有元素在集合中,那么就一直阻塞直到发现元素为止
$ brpop key1 [key2] timeout
#12.对列表进行修剪,只保留指定区间的值,未在指定区间内的值会被删除
$ ltrim key start stop
#13.通过索引设置列表元素的值
$ lset key index value
#14.将一个元素插入到列表元素前或后插入元素
$ linsert key before 列表元素 要插入元素
$ linsert key after 列表元素 要插入元素
#15.将列表1中最后的元素删除,插入到列表2的开始处。如果是同一个列表,那么就会把最后的元素移位到最开始处
$ rpoplpush 列表1 列表2
#16.操作和15类似,只不过如果列表1没有元素,那么就会阻塞直到获取到元素或到达超时时间,未设置超时时间则直到获取到元素
$ brpoplpush 列表1 列表2 timeout

redis主从复制,读写分离

# 主
# redis.conf中注释bind
$ #bind 127.0.0.1
# redis.conf中设置密码
$ requirepass 密码
# redis.conf中设置守护进程方式运行
$ daemonize yes
# redis.conf中设置最大连接数,默认10000
$ maxclients 10000
# redis.conf中设置最大内存(默认不受限制,但如果有多个从服务器,设置低于服务器内存的值)
$ maxmemory 字节为单位
# redis.conf中设置内存策略
$ maxmemory-policy 对应内存策略(推荐volatile-lru、allkeys-lru)
# 从
# redis.conf中注释bind
$ #bind 127.0.0.1
# redis.conf中配置主ip和port
$ replicaof ip port
# redis.conf中配置主密码
$ requirepass 密码

# 测试,启动主和从redis,并加载对应redis.conf文件
# 登录客户端使用info查看是否有对应的主和从

java连接redis

  • Springboot项目2.0之前内置jedis,2.0之后使用的是lettuce,具体连接可以参考以下连接👇
jedis连接参考

springboot连接redis参考

lettuce连接参考

springboot连接redis参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值