Redis学习笔记实用干货

Redis

1:数据库应用的发展历程

​ 单机数据库时代:一个应用,一个数据库实例。

​ Mencached(缓存)时代:

​ 读写分离时代

​ 分表分库时代(集群)

​ 关系型数据库:oracle,mysql,DB2,sqlServer …

​ 非关系型数据库(NoSql):彻底改变底层存储机制。不是采用关系型数据模型,而是采用聚合数据结构存储数据。

​ 非关系型数据库:redis,mogoDB,HBase …

2:Redis简介

​ Redis是一种数据库。能够存储数据,管理数据的一种软件,mysql oracle

Remote Dictionary Server(Redis)是一个开源的使用 C 语言编写、支持网络、可基于内存运行并支持持久化的高性能的NoSql数据库

Redis中的数据大部分时间都是存储内存中的。适合存储频繁访问,数据量比较小的数据。

3:安装redis:参考安装手册。

1:下载:

解压:tar -zxvf …
编译:make
需要先安装gcc
编译结果:在redis的安装目录下src目录中,生成redis的一系列可执行文件。
安装:make install
把redis的安装目录下src目录中生成redis的一系列可执行文件拷贝到/usr/local/bin中,
在任何目录下都可以执行redis命令。

2:启动redis服务:

1)前台启动:在任何目录下执行 redis-server
2)后台启动(推荐):在任何目录下执行 redis-server &
3)启动redis服务时,指定配置文件:redis-server redis.conf &

3:关闭redis服务

​ 1)通过kill命令强制杀死进程(容易丢失数据,不推荐)

​ ps -ef | grep redis 查看pid

​ kill -9 pid :杀死redis进程

​ 2)通过redis命令关闭

​ redis -cli shutdown

4:redis的客户端

​ 用来连接redis服务,向redis服务端发送命令,并且显示redis服务处理结果。

redis-cli:是redis自带的客户端,使用命令redis-cli就可以启动redis的客户端程序。

redis-cli :默认连接127.0.0.1(本机)的6379端口上的redis服务

redis-cli -p 端口号:连接127.0.0.1(本机)的指定端口上的redis服务

redis-cli -h ip地址 -p 端口号:连接指定ip主机上的指定端口的redis服务

关闭客户端:在客户端执行命令:exit 或者 quit

5:redis基本知识

1)测试redis服务的性能:redis-benchmark

2)查看redis服务是否正常运行:ping

​ 如果正常,显示pong

3)查看redis服务器的统计信息:info

​ 查看redis服务器指定的统计信息:info 信息段名称

4)redis的数据库实例:作业类似于mysql的数据库实例,redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例。默认情况下,redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15。使用时通过编号来使用数据库,可以通过配置文件,来指定redis自动创建的数据库个数。redis的每一个数据库实例本身占用的存储空间是很少的,所以也不造成存储空间的太多浪费。

​ 默认情况下,redis客户端连接的是编号是0的数据库实例;

​ 可以使用 select index 来切换数据库实例

5)查看当前数据库实例中所有key的数量:dbsize

6)查看当前数据库实例中所有的key:keys *

7)清空数据库实例中所有的数据:flushdb

8)清空所有的数据库实例的所有数据:flushall

9)查看redis中所有的配置信息:config get *

​ 查看redis中指定的配置信息:config get 配置参数名(例如查看端口号:config get port)

6:Redis的五种数据结构

​ 程序是用来处理数据的,Redis是用来存储数据的。程序处理完的数据要存储到redis中,不同特点的数据,要存储在redis中不同类型的数据结构中。

字符串: zhangsan 20 true string 单key:单value 例如:username:zhangsan age:20
list列表: 13900009999 zs@163.com 321321 list 单key:多有序value 例如:contacts:13900009999,xxx,xxxx
set集合: beijing shanghai chongqing tianjin set 单key:多无序value 例如:city:bj sh cq tj
pojo: id:1001,name:zhangsan,age:20 hash 单key: 对象(属性:值):
student :id:1001,name:zhangsan,age:20
zset 单key:多有序vlaue:
city: 1000 tj,1200 cq,1500 sh,2000 bj

7:Redis中的常用操作命令

1)redis中有关key的操作命令

1:查看数据库中的key:keys pattern(通配符)

​ *:匹配0个或者多个字符

​ keys * :查看数据库中所有的key

​ keys k*:查看数据库中以k开头的key

​ keys k*o:查看数据库中以k开头,以o结尾的

?:匹配一个字符

​ keys h?o:查看数据库中所有以h开头,以o结尾的,并且中间只有一个字符的key

[ ]:匹配[ ]里边的1个字符

​ keys h[abc]llo:查看数据库中所有以h开头,以llo结尾,并且h后边只能取abc中一个字符的key

2:判断key在数据库中是否存在:exists key

​ exists key:如果存在,返回1,如果不存在,返回0

​ exists k1 k2 k3 k4:判断这些key是否存在,返回值是存在的key的数量

3:移动指定key到指定的数据库实例:move key index

​ move k 1:将key为k的数据,移动到1号数据库实例

4:查看key的剩余生存时间:ttl key

​ 如果查看的key不存在,返回-2

​ 如果查看的key存在,并且返回-1,就表示没有设置生存时间

5:设置key的最大生存时间:expire key 数值(单位秒)

6:查看指定key的数据结构:type key

7:重命名key:rename 旧key 新key

8:删除指定key:del key

​ 删除多个key:del key key 多个key之间用空格隔开,如果key不存在,会忽略,返回真实删除的数量

2)redis中有关string类型的数据的操作命令

1:将string类型的数据保存到redis中:set 键 值

​ set zsname zhangsan

​ 如果key已经存在,则覆盖之前的value

2:从redis中获取string类型的数据:get 键

​ get zsname

3:追加字符串:append key value

​ append zsname 123 表示在zhangsan后边追加123

​ 返回追加之后的字符串长度

​ 如果key不存在,相当于set key value

4:获取字符串数据的长度:strlen key

​ strlen k1

5:对字符串数值进行加1运算:incr key

​ 返回加1运算之后的数值,如果key不存在,会首先设置一个key,初始值为0,然后进行incr key 运 算。要求前提是key表示的value,必须是数值。如果不是数值,直接报错。

6:对字符串数值进行减1运算:decr key

​ 跟以上加1操作一样

7:对字符串数值进行加指定数值运算:incrby key 100

​ incrby age 10(表示对年龄加10)

​ 其他操作,跟以上加1一样

8:闭区间获取字符串key中从startIndex 到 endIndex的字符组成的子字符串:getrange key startIndex endIndex

​ 下标从0开始,自左至右,最后一个字符的下标,是字符串长度 减1

​ 下标也可以是负数,自右至左,下标从-1开始,最右边的第一个字符是-1

​ getrange name 2 5 (表示截取下标2开始到下标5结束的字符串,同时2和5的下标也包含)

​ 返回值,截取后的字符串

9:用value覆盖从下标为starIndex开始的字符串:setrange key startIndex value

​ setrange name 5 xiaosan(表示从下边为5的value字符,开始修改成xiaosan)

10:设置字符串数据的同时,设置最大生命周期:setex key 秒数 value

11:设置string类型的数据value到redis数据库中,当key不存在时设置成功,否则,设置失败:setnx 键 值

​ setnx name lisi

12:批量将string类型的数据设置到redis中,mset 键1 值1 键2 值2

13:批量获取string类型的数据:mget 键1 键2 键3

14:批量将string类型的数据设置到redis中,当所有key都不存在时设置成功,否则只要有一个key存在,全部失败:msetnx 键1 值1 键2 值2

3)redis中有关list类型的数据的操作命令

​ 单key-多有序value

​ 一个key对应多个value

​ 多个value之间有顺序,最左侧是表头,最右侧是表尾,每一个元素都有下标,第一个元素下标是0,最后一个是list长度减1,每一个下标又可以用负数表示,负下标表示从表尾计算,最后一个元素下标用-1表示。

​ 元素在列表中的顺序或者下标由放入的顺序来决定

1:将一个或者多个值依次插入到列表的表头(左侧):lpush key value value value

​ lpush list01 1 2 3

2:获取指定列表中指定下标区间的元素:lrange key startIndex endIndex

​ lrange list01 0 2 结果:123

​ 获取全部:lrange list01 0 -1

3:将一个或者多个值依次插入到列表的表尾(右侧):rpush key value value value

​ rpush list02 a b c 结果就是:a b c

4:从指定列表中移除并且返回表头元素:lpop key

​ lpop list02

5:从指定列表中移除并且返回表尾元素:rpop key

​ rpop list02

6:获取指定列表中指定下标的元素:lindex key index

​ lindex list02 1 结果:b

7:获取指定列表的长度:llen key

​ llen list02

8:根据count值移除指定列表中跟value相等的数据:lrem key count value

​ count > 0:表示从列表的左侧移除count个跟value相等的数据

​ count < 0:表示从列表的右侧移除count个跟value相等的数据

​ count = 0:表示从列表中移除所有跟value相等的数据

9:截取指定列表中指定下标区间的元素组成新的列表,并且赋值给key:ltrim key starIndex endIndex

​ lpush lisy04 1 2 3 4 5 6 结果:5 4 3 2 1

​ ltrim list04 1 3

​ lrange list04 0 -1 结果:4 3 2

10:将指定列表中指定下标的元素设置为指定值:lset key index value

​ lset list04 1 10

11:将value插入到指定列表中位于pivot元素之前/之后的位置:linsert key before/after pivot value

​ linsert list04 before 10 50

​ linsert list04 after 10 60

4)redis中有关set类型数据的操作命令

​ 单key-多无序value

​ 一个key对应多个value,value之间没有顺序,元素没有下标,并且不能重复,通过业务数据直接操作集合。

1:将一个或者多个元素添加到指定的set集合中:sadd key value [value value]

​ sadd set01 a b c d e f g

​ 如果有重复的value,只会加入一个

​ 返回成功加入的元素的个数

2:获取指定集合中所有的元素:smembers key

3:判断指定元素在指定集合中是否存在:sismember key value

​ sismember set01 f

​ 存在返回 1

​ 不存在返回 0

4:获取指定集合得长度:scard key

​ scard set01

5:移除指定集合中一个或者多个元素:srem key value [value value]

​ 不存在的元素,会被忽略

​ 返回移除成功的个数

​ srem set01 b a c

6:随机获取指定集合中的一个或者多个元素:srandmember key [count]

​ count > 0 :表示随机获取count个不重复的元素

​ count < 0 :表示随机获取count个可能重复的元素

7:随机从指定集合中移除一个或者多个元素:spop key [count]

​ 返回被移除的元素

8:将指定集合中的指定元素移动到另一个集合:smove 原来的集合 移动的目标集合 元素

​ smove set01 set02 a

9:获取第一个集合中有,但是其它集合中没有的元素组成的新的集合:sdiff key key [key key …]

​ sdiff set01 set02 set03

10:获取所有指定集合中都有的元素组成的新集合:sinter key key [key key…]

​ sinter set01 set02 set03

11:获取所有指定集合中所有的元素组成的大集合:sunion key key [key key …]

​ sunion set01 ste02

5)redis中有关hash类型数据的操作命令

​ 单key:一个或者多个field-value

​ 例如:studentzs:id-10001

​ name-zhangsan

​ age-20

​ field:表示域,value:表示真正的数据业务

1:将一个或者多个field-value对存储到哈希表:hset key field1-value [field2-value2…]

​ hset stu01 id 1001 name zhangsan

​ 如果key field已经存在,把value会把以前的值覆盖掉

2:获取指定哈希表中的指定filed的值:hget key field

​ hget stu01 id

​ hget stu01 name

3:将一个或者多个field-value对存储到哈希表:hmset key field1-value [field2-value2…](和hset 一样的效果)

4:批量获取指定哈希表中的filed的值:hmget key field[field field…]

​ hmget stu01 id name

5:获取指定哈希表中所有的field和value:hgetall key

​ hgetall stu01

6:从指定哈希表中删除一个或者多个field :hdel key field [field field …]

​ hdel stu01 id name

7:获取指定哈希表中所有的field个数:hlen key

​ hlen stu01

8:判断指定哈希表中是否存在某一个field:hexists key field

​ hexists stu01 id

​ 返回0 表示不存在,1表示存在

9:获取指定哈希表中所有的field列表:hkeys key

​ hkeys stu01

10:获取指定哈希表中所有的value列表:hvals key

​ hval stu01

11:对指定哈希表中指定的field值进行整数加法运算:hincrby key field int

​ hincrby stu01 age 5

12:对指定哈希表中指定的field值进行浮点数加法运算:hincrbyfloat key field float

​ hincrbyfloat stu01 score 5.5

13:将一个field-value对存储到哈希表中,当key-field已经存在时,则放弃设置,否则存储成功:hsetnx key field value

​ hsetnx stu01 id 10002

6)redis中有关zset类型数据的操作命令

​ 有序集合

Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。

不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。

1:将一个或者多个meber(元素)及其score(分数)值加入到有序集合:zadd key score meber [score meber …]

​ zadd zset01 20 z1 30 z2 40 z3

​ 如果元素已经存在,则把分数覆盖

2:获取指定的有序集合中指定下标区间的元素:zrange key startIndex endIndex [withscores]

​ zrange zset01 0 -1

​ zrange zset01 0 -1 withscores :表示可以同时查看分数

3:获取指定有序集合中指定分数区间(闭区间)的元素:zrangebyscore key min max

​ zrangebyscore zset01 20 30

4:删除指定有序集合中一个或者多个元素:zrem key member [member …]

​ zrem zset01 z3 z4

5:获取指定有序集合中所有元素的个数:zcard key

​ zcard zset01

6:获取指定有序集合中指定元素的排名:zrank key member

​ zrank zset01 z1

​ 指定元素的排名从0开始(按照分数从小到大排)

7:获取指定有序集合中指定元素的排名:zrevrank key member

​ zrevrank zset01 z1

​ 指定元素的排名从0开始(按照分数从大到小排)

8:获取指定有序集合中分数在指定区间内的元素的个数:zcount key min max

​ zcount zset01 10 30

9:获取指定有序集合中指定元素的分数:zscore key member

​ zscore zset01 z2

8:Redis的配置文件

​ 在redis根目录下提供的redis.conf 配置文件,可以配置一些redis服务端运行时的一些参数。如果不使用配置文件,那么redis会按照默认的参数运行。如果使用配置文件,在启动redis服务时,必须指定所使用的配置文件。

1)redis配置文件中关于网络的配置:

​ prot:指定redis服务所使用的端口,默认使用6379

​ bind:配置客户端连接redis服务时,所能使用的ip地址,默认使用redis所在主机上任何一个ip都可以;一般情况下都会配置指定一个ip,而且这个ip通常使用的是一个真实的ip。

如果配置了port和bind,则客户端连接redis服务时,必须指定端口和ip

​ 客户端连接redis服务指令:redis-cli -h 真实的IP地址 -p 端口号

​ 客户端关闭redis服务指令:redis-cli -h 真实的IP地址 -p 端口号 shutdown

​ tcp-keepalive:TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。

2)常规配置

​ loglevel:配置日志级别,开发阶段配置debug,上线阶段配置notice或者warning

​ logfile:指定日志文件。redis在运行过程中,会输出一些日志信息,默认情况下这些日志信息,会输出到控制台,我们可以使用logfile配置日志文件,使redis把日志信息输出到指定的文件中。

​ databases:配置数据库数量,默认16个

3)安全配置(不推荐使用)

​ requirepass:配置Redis的访问密码,默认不配置密码,即不需要密码验证。此配置项需要在protected-mode=yes时起作用。使用密码登录客户端:redis-cli -h ip -p 6379 -a pwd

9:Redis的持久化

​ redis提供持久化策略,在适当的时机采用适当的手段把内存中的数据持久化到磁盘上中,每次启动reids服务时,都可以把磁盘上的数据再次加载到内存中使用。

1:RDB策略

​ 在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作。RDB策略是redis默认策略。如果要禁用持久化功能,则把所有的save配置都注释掉。

save <seconds> <changes>:配置持久化策略
dbfilename:配置redis RDB持久化数据存储的文件
dir: 配置redis RDB持久化文件所在目录,redis安装目录下

2:AOF策略

采用操作日志来记录进行每一次写操作。每次redis服务启动时,都会重新执行一遍操作日志中的指令。
效率低下,redis默认不开启AOF功能。

​ appendonly:配置是否开启AOF策略
​ appendfilename:配置操作日志文件

小结:根据数据的特点决定开启哪种持久化策略;
一般情况,开启RDB足够了。

10:Redis的事务

​ 事务:把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,要么同时失败。

​ Redis事务:允许在把一组redis命令放在一起,把命令进行序列化,然后一起执行,保证部分原子性。

​ 1)multi:用来标记一个事务的开始

​ 2)exec:用来执行事务队列中所有的命令

​ 3)redis的事务只能保证部分原子性:

​ a)如果一组命令中,有在压入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性。

​ b)如果一组命令中,在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其他命令的执行,不能够保证事务的原子性。

​ 4)discard:清除所有已经压入队列中的命令,并且结束整个事务。

​ multi

​ set k1 v1

​ set k2 v2

​ 添加到这里,不想添加了,使用

​ discard 清除队列,并结束事务

​ 5)watch:监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行;否则,正常执行

		set balance 100

		 set balance2 1000
		set version 1

		watch version
		 multi
		decrby balance 50
		 incrby balance2 50
		exec

​ 6)unwatch:放弃监控所有的键

​ watch version

​ (根据实际业务判断是否监控)unwatch version

			 multi
			decrby balance 50
		 	incrby balance2 50
			exec

11:Redis消息的发布与订阅

​ redis客户端订阅频道,消息的发布者往频道上发布消息,所有订阅此频道的客户端都能接收到。

​ 1)subscribe:订阅一个或者多个频道的消息

​ subscribe ch1 [ch2 ch3]

​ 2)publish:将消息发布到指定频道

​ publish:ch1 Hello

​ 3) psubcribe:订阅一个或者多个频道的消息,频道名支持通配符。

​ subscribe news.*

12:Redis的主从复制

​ 主少从多,主写从读,读写分离,主写同步复制到从

​ 1)搭建一主二从redis集群:使用一个redis模拟三台服务器

​ 提供三分redis配置文件:redis6379.cnf,redis6380.conf,redis6381.conf

​ 修改三份配置文件:以redis6379.conf为例

​ bind 127.0.0.1
​ port 6379
​ pidfile /var/run/redis_6379.pid
logfile “6379.log”
​ dbfilename dump6379.rdb

		分别使用三个redis配置文件,启动三个redis服务:
  			 redis-server redis6379.conf &
			redis-server redis6380.conf &
			 redis-server redis6381.conf &

​ 2)通过redis客户端分别连接三台redis服务器

​ redis-cli -h 127.0.0.1 -p 6379
​ redis-cli -h 127.0.0.1 -p 6380
​ redis-cli -h 127.0.0.1 -p 6381

​ 3)查看三台redis服务在集群中的主从角色:

​ info replication
​ 默认情况下,所有的redis服务都是主机,即都能写和读,但是都还没有从机。

​ 4)先在6379进行写操作:
​ set k1 v1
​ 三台rdis服务互相独立,互不影响。
5)设置主从关系:设从不设主
​ 在6380上执行:slaveof 127.0.0.1 6379
​ 在6381上执行:slaveof 127.0.0.1 6379

​ 6)全量复制:一旦主从关系确定,会自动把主库上已有的数据同步复制到从库。
​ 在6380和6381上执行:keys *

		7)增量复制:主库写数据会自动同步到从库。
 				在6379上执行:set k2 v2
 				在6380和6381上执行:keys *

​ 8)主写从读,读写分离:
​ 在6380和6381上执行:set k3 v3 ===>报错

	  9)主机宕机、从机原地待命:
 				关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown

​ 查看6380和6381服务的主从角色:info replication

	  10)主机恢复、一切恢复正常:
 				重启6379服务:redis-server redis6379.conf &
 				客户端连接6379:redis-cli -h 127.0.0.1 -p 6379

	  11)从机宕机、主机少一个从机、其它从机不变:
 				关闭6380服务: redis-cli -h 127.0.0.1 -p 6380 shutdown

​ 查看6379服务的主从角色:info replication
​ 查看6381服务的主从角色:info replication

	  12)从机恢复、需要重新设置主从关系:
 				重启6380服务:redis-server redis6380.conf &
 				客户端连接6380:redis-cli -h 127.0.0.1 -p 6380

​ 在6380上执行: slaveof 127.0.0.1 6379

	  13)从机上位:
 			a)主机宕机、从机原地待命:
  			 关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
   			查看6380和6381服务的主从角色:info replication
 			b)从机断开原来主从关系:
  			 在6380上执行:slaveof no one
  			 查看6380服务的主从角色:info replication
 			c)重新设置主从关系:
   				在6381上执行:slaveof 127.0.0.1 6380
 			d)之前主机恢复、变成孤家寡人:
   				重启6379服务:redis-server redis6379.conf &
   				客户端连接6379:redis-cli -h 127.0.0.1 -p 6379
 			e)天堂变地狱:
   				在6379上执行:slaveof 127.0.0.1 6381
   				在6381上执行:info replication   既是主机又是从机

​ 小结:一台主机配置多台从机,一台从机又可以配置多台从机,从而形成一个庞大的集群架构。
​ 减轻一台主机的压力,但是增加了服务间的延迟时间。

13:redis哨兵模式:主机宕机、从机上位的自动版

​ 1)搭建一主二从集群架构:(12节前五步)

​ 2)提供哨兵配置文件:
​ 在redis安装目下创建配置文件:redis_sentinel.conf
​ sentinel monitor dc-redis 127.0.0.1 6379 1

​ 3)启动哨兵服务:
​ redis-sentinel redis_sentinel.conf

​ 4)主机宕机:
​ 关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
​ 哨兵程序自动选择从机上位。

​ 5)之前主机恢复:自动从属于新的主机。
​ 重启6379服务:redis-server redis6379.conf &
​ 客户端连接6379:redis-cli -h 127.0.0.1 -p 6379

14、java操作redis数据库

​ jedis是redis官方提供的操作redis数据的技术。
​ 把所有的redis指令都定义成java工具类的方法,方法名和redis的指令名完全一样;
​ 开发通过程序访问redis,只需要使用工具类及其方法即可。

在java程序中访问redis:
   1)创建maven版的java工程
   2)添加jedis依赖
      <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.1.0</version>
    </dependency>
   3)创建Jedis连接
 *关闭linux的防火墙

redis-cli -h ip -p port

keys *
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳落青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值