Redis学习笔记
Redis是一种数据库,能够存储数据,管理数据的一种软件。数据库应用的发展历程:1.单机数据库,一个应用,一个数据库实例2.缓存、水平切分时代3.读写分离时代4.分表分库时代(集群)关系型数据库:oracle、mysql、DB2、sqlserver。。。。非关系型数据库(NoSql):彻底改变底层存储机制,不再采用关系型数据模型,而是采用聚合数据结构存储数据。Redis是一个用C语言编写的,开源的
Redis介绍
Redis是一种数据库,能够存储数据,管理数据的一种软件。
数据库应用的发展历程:
1.单机数据库,一个应用,一个数据库实例
2.缓存、水平切分时代
3.读写分离时代
4.分表分库时代(集群)
关系型数据库:oracle、mysql、DB2、sqlserver。。。。
非关系型数据库(NoSql):彻底改变底层存储机制,不再采用关系型数据模型,而是采用聚合数据结构存储数据。
Redis是一个用C语言编写的,开源的,基于内存运行并支持持久化的,高性能的NoSQL数据库,也是当前热门的NoSQL数据库之一。
Redis中的数据大部分时间都是存储内存中的,适合存储频繁访问,数据量比较小的数据,缓存数据库。
Redis特点
1.支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.支持多种数据结构,不仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
3.支持数据备份,即master-slave模式的数据备份。
安装Redis
第一步:去官网https://Redis/io下载安装包
第二步:使用Xftp工具把安装包(redis-6.0.16.tar.gz)上传到Linux系统中的 /opt目录
第三步:解压安装包到 /opt目录 tar -zxvf redis-6.0.16.tar.gz -C /opt
因为redis-6.0.16/src目录下都是c语言,编译c语言需要用到gcc的编译器
第四步:安装gcc(GNU compiler collection)的缩写,它是Linux下一个预编译集合(相当于javac),是c或c++程序的编译器
方式一:有外网的情况下使用yum安装,执行命令:yum -y install gcc
方式二:没有外网情况下,从光盘里进行安装
从终端进入目录:/rum/media/root/CentOS 7 x86_64/Packages
依次执行命令:
rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm 回车
rpm -ivh cpp-4.8.5-11.el7.x86_64.rpm 回车
rpm -ivh kernel-headers-3.10.0-514.el7.x86_64.rpm 回车
rpm -ivh glibc-headers-2.17-157.el7.x86_64.prm 回车
rpm -ivh glibc-devel-2.17-157.el7.x86_64.rpm 回车
rpm -ivh libggomp-4.8.5-11.el7.x86_64.rpm 回车
rpm -ivh gcc-4.8.5-11.el7.x86_64.rpm 回车
查看gcc是否安装好使用命令:gcc -v
第五步:在/redis-6.0.16目录里执行make命令进行编译c语言
第六步:执行make install 安装Redis
注意:在make执行之后在执行 make install,该操作则将src下的许多可执行文件复制到/usr/local/bin目录下,这样做可以在任意目录执行redis的软件命令(例如,启动、停止、客户端连接服务器等等),make install也可以不用执行,看个人习惯。
第七步:启动Redis
方式一:前台启动redis-server 占用终端命令行
方式二:后台启动redis-server & (推荐使用后台启动)
方式三带配置文件启动:redis-server redis.conf配置文件位置 &
默认占用6379端口
关闭Redis:redis-cli shutdown
第八步:连接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
Redis的基本知识和命令
1.查看redis服务是否正常运行:ping
2.查看redis服务器的统计信息
info:查看redis服务器的所有信息
info [信息段] :查看redis服务器的指定的统计信息,如:info Replication
3.redis的数据库实例:redis中的数据库实例只能有redis服务来创建和维护,开发人员不能修改和自行创建数据库实例,默认情况下,redis会自动创建16个数据库实例,并且给这些数据库实例编号,从0开始一直到15,使用时通过编号来使用数据库。可以通过配置文件,指定redis自动创建数据库个数,redis的每个数据库实例本身占用的存储空间很少,所以也不造成存储空间的浪费。
默认使用的是0数据库
切换数据库:select 2,切换到2数据库
4.查看当前数据库中的key的数量:dbsize
5.查看都有哪些key:keys *
6.清空当前数据库:flushdb
7.清空所有数据库数据:flushall
8.查看redis中所有的配置信息: config get *
Redis5种数据结构
1.字符串类型string
字符串类型是redis中最基本的数据结构,它能存储任何数据类型,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M
key value
username 张三
2.列表类型list
redis列表是简单的字符串列表,按照插入顺序排列,你可以添加一个元素到列表的头部或者尾部,底层是一个链表结构
key value
region 北京、上海、天津
3.set集合类型
redis的set是string类型的无序无重复集合
key value
spring
framework mybatis
struts
4.哈希类型hash
redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
key loginuser
field value
uname 张山
times 5
region 北京
5.有序集合类型zset(sorted set)
redis有序集合zset和集合set一样也是string类型元素的集合,且不允许重复,不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序
key value score
张三 3500
salary 李四 5000
周莉 8000
Redis数据库通用操作命令
1.redis中关于key的操作命令:
查看数据库中的key:keys *
查看以k开头的key:keys k*
查看以k开头b结尾的key:keys k*b
2.判断key在数据库中是否存在:exists key 存在返回1,不存在返回0
3.移动指定key到指定的数据库中:move key 数据库编号
4.查看指定key的剩余生存时间:ttl key
没有设置生存时间返回-1
如果key不存在返回-2
5.设置key的最大生存时间:expire key 秒
expire k2 20,,k2生存周期20秒,超过20秒就会被自动删除
6.查看指定key的数据类型:type key
7.重命名key:rename key 新名字
8.删除指定key:del key key key
返回实际的删除数量
Redis中有关String类型数据的操作命令
1.添加:set key value
2.获取值:get key
3.追加字符串:append key 追加字符串
返回追加之后的字符串长度
key不存在,则新建一个key存放追加字符串
4.获取字符串长度:strlen key
5.将字符串数值进行加1运算:incr key
返回加1运算之后的数据
如果key不存在,首先设置一个key,初始值为0,然后进行加1运存
要求key的value值必须是数值,否则报错
6.减1运算:decr key
返回减1之后的数据
如果key不存在,首先设置一个key,初始值为0,然后进行减1
要求key的value值必须是数值,否则报错
7.加任意数值:incrby key 任意数值
返回加任意数运算之后的数据
如果key不存在,首先设置一个key,初始值为0,然后进行减1
要求key的value值必须是数值,否则报错
8.减任意数值:decrby key 任意数
返回加任意数运算之后的数据
如果key不存在,首先设置一个key,初始值为0,然后进行减1
要求key的value值必须是数值,否则报错
9.获取闭区间的value:getrange key 下标 下标
getrange k1 0 5
从左往右数就是012345...... 从右往左数就是-1 -2 -3 -4 -5.......
10.覆盖value值:setrange key 5 字符串
11.添加key时同时设置它的最大生命周期:setex key 生命周期 value
12.添加key,当数据库中没有同名key时添加,有则放弃:setnx key value
13.批量添加string类型的key value:mset key1 value1 key2 value2.....
14.批量获取string类型的数据:mget key1 key2......
15.批量设置string类型的数据value到redis数据库中,当所有key都不存在时设置成功,只要有一个key存在,放弃设置。
msetnx k1 v1 k2 v2....
Redis中有关List类型数据的操作命令
1.将一个或多个值一次插入到列表的表头(左侧):lpush key value value.......
存入顺序是 1 2 3 4 5......
放到库里的顺序是 ....5 4 3 2 1
2.获取指定列表中指定下标区间的元素:lrange key 下标 下标
3.将一个或多个值一次插入到列表的表尾:rpush key value value...
存入顺序:1 2 3 4 5...
放到库里顺序:1 2 3 4 5...
4.删除指定列表表头元素并返回删除的元素:lpop key
5. 删除指定列表表尾元素并返回删除的元素:rpop key
6.根据count值,删除指定列表中跟value一样的元素:lrem key count value
count值>0:从列表的表头(左侧)移除count个跟value相等的值
count值<0:从列表的表尾(右侧)移除count个跟value相等的值
count值=0:从列表中移除所有跟value相等的值
7.获取指定列表中指定下标元素:lindex key 下标
8. 获取指定列表的长度:llen kye
Redis中有关set类型数据的操作命令
单key,多无序value
一个key对应多个value,value之间没有顺序,并且不能重复
1.将一个或多个元素添加到指定的集合中:sadd key value value...
如果元素存在,则会忽略不添加
返回成功添加元素的个数
2.获取指定集合中所有元素:smembers key
3.判断指定元素在指定集合中是否存在:sismember key 指定元素
返回1,存在
返回0,不存在
4.删除集合中,指定元素或多个元素 :srem key value value..
5.随机获取集合中的一个或多个元素:srandmember key 数量
6. 从指定集合中随机移除一个或多个元素:spop key 数量
7.将指定集合的指定元素移动到另一个集合中:smove 源集合 目标集合 移动的值
8.求差集,获取指定第一个集合里有,其他集合里没有的数据:
sdiff set set set...
9.求交集,获取集合中都有的数据:sinter set set set....
10.求并集,获取指定集合的并集,重复元素不要:sunion set set set...
Redis中有关hash类型数据的操作命令
key:field-value field-value.....
例,student:id 2001 age 20 name zs
1.添加数据到哈希表中:hset key 属性 值 属性 值
2.获取哈希表中指定数据:hget key 属性
3.批量获取指定哈希表中的属性值:hmget student id name age
4.根据key获取key中所有的属性名和属性值
5.从哈希表中删除指定的属性和属性值:hdel key 属性名
6.获取指定哈希表中 属性名和属性值的个数:hlen key
7.判断指定哈希表中是否存在某一个属性名和属性值
hexists key 属性名
返回1存在,返回0不存在
8.获取哈希表中所有的属性名: hkeys key
9.获取哈希表中所有的属性值:hvals key
10.将一个属性名和属性值添加到哈希表中,如果表中已存在该属性名和属性值就放弃添加
hsetnx student age 22
Redis中有关zset类型数据的操作命令
zset:有序集合,本质上是集合,所有元素不能重复,
每一个元素都关联一个分数,redis会根据分数对元素进行自动排序,分数可以重复
既然有序集合中每一个元素都有顺序,那么也都有下标
有序集合中元素的排序规则又和列表中元素的排序规则不一样
1.将一个或多个元素添加到zset集合中:zadd zset 分数 值
*如果元素以存在,则把分数覆盖
2.获取指定zset集合中指定下标区间的元素: zrange zset01 0 -1
3.获取指定有序集合中,指定分数区间的元素:
zrangebyscore key 最小分数 最大分数 [withscores显示分数]
zrangebyscore zset01 20 40 withscores
4. 删除指定集合中一个或多个元素:zrem key 值
zrem zset01 lisi wangwu
5.获取集合中所有元素的个数:zcard key
6.获取集合中分数在指定区间内的元素个数: zcount key min max
7.获取集合中指定元素的排名(从0开始):zrank key 值
8.获取集合中指定元素的分数:zscore key 元素值
Redis的配置文件
redis根目录下提供redis.conf配置文件
可以配置一些redis服务端运行的一些参数;
如果不使用配置文件,redis会安装默认的参数运行
如果使用配置文件,在启动redis服务时必须指定使用的配置文件
1.redis配置文件中关于网络的配置
打开redis配置文件,在redis根目录下:vim redis.confg
port:指定redis服务所使用的端口,默认使用6379
bind:配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主
机上任何一个ip都可以,一般情况下都会配置一个真实ip。
如果配置了port和bind,启动redis服务时必须使用:redis-server redis.confg &命令启动
如果配置了port和bind,客户端连接redis服务时,必须指定端口和ip:redis-cli -h ip -p端口
改了IP地址和端口,关闭redis服务时要指定ip和端口:redis-cli -h ip -p 端口
2.常规配置
loglevel:配置日志级别,开发段配置为debug,上线阶段配置为notice
logfile:指定日志文件,redis在运行过程中,会输出一些日志,默认输出到控制台,可以使用
logfile配置日志文件,是redis把日志信息输出到指定文件中。
databases:配置redis服务启动时创建数据库个数,默认是16个
3.安全配置
requirepass:设置访问redis服务时所使用的密码,默认不使用
此参数必须在protrcted-mode=yes时才起作用
一旦设置了密码验证,客户端连接redis服务时,必须使用密码连接:
redis-cli -h ip -p端口 -a 密码
Redis持久化
redis提供持久化策略,在适当的时机采用适当的手段把内存中的数据持久化到磁盘中,每次redis服务启动时都可以把磁盘上的数据再次加载到内存中使用
1.RDB策略:在指定时间间隔内,redis服务执行指定次数的写操作,会触发一次持久化操作。
RDB策略是redis默认的持久化策略,redis服务启动时,默认就已经开启RDB策略。
dbfilename:Redis持久化数据生成的文件名,默认是dump.rdb,也可以自己配置。
dir:redis持久数据生成文件保存的目录,默认是./redis启动目录,也可以自己配置
如,下图RDB策略默认参数
AOF策略:采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新执行一遍操
作日志中的指令。
效率低下,redis默认不开启AOF功能。
Redis的事务
事务:把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,要么同时失败。
redis事务:允许把一组redis命令放在一起执行,把命令进行序列化,然后一起执行,保证部
分原子性。
1.multi:用来标记一个事务的开始。如下图
2.exec:用来执行事务队列中所有的命令。如上图
3.redis的事务只能保证部分原子性,如果一组命令中,在压入队列过程中发生错误的命令,则本
事务中所有的命令都不执行,能够保证事务的原子性。
4.如果一组命令中,压入队列过程中正常,但是在执行事务队列时发生了错误,则只会影响发生
错误的命令,不会影响其他命令的执行,不能够保证事务的原子性。
5.discard:清除所有已经压入队列中的命令,并且结束整个事务
6.watch:监控某一个key,当事务在执行过程中,此key得value值发生变化,则本事务放弃
执行,否则正常执行。
7.放弃监控所有的键:unwatch
watch version #监视
unwach #放弃监视
multi #开启事务
decrby balance 50 #-50
incrby balance2 50 #+50
exec 执行事务
redis主从复制
主机数据跟新后根据配置和策略,自动同步到从机的master/slave机制,master以写为主,slave以读为主。
搭建一主二从redis集群:
1.搭建三台从redis服务,使用一个redis模拟三台redis服务
提供三份redis配置文件:redis6379.conf redis6380.conf redis6381.conf
修改三份配置文件:以redis6379.conf为例 ,修改一下配置参数
bind 127.0.0.1
port 6379
piddile /var/run/redis_6379.pid
logfil "6379.log"
dbfilename dump6379.rdb
2.分别使用三个redis配置文件,启动三个redis服务
redis-server redis6379.conf &
redis-server redis6380.conf &
redis-server redis6381.conf &
3.通过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
4.查看三台redis服务在集群中的主从角色:
info replication
默认,所有redis服务都是主机,即都能读和写,但都没有从机
5.设置主从关系:设从不设主
6379为主机
设置6380为从机,在6380端口客户端上执行命令:slaveof 主机ip 主机端口
在6381端口客户端也执行:slaveof 127.0.0.1 6379
此时主机下已有两台从机,如下图
以上就是主从设置,一旦设置完成,主机上的数据会复制到从机上
6.从机宕机,修复完成后连接redis服务会变成主机,必须重新设置主从关系
7.主机宕机,从机依旧可以读数据
8.从机上位
原因:主机宕机,暂时无法恢复,需要找一个性能好的从机来当主机
跟主机断开主从关系,断开之后从机就会变成主机,在从机上执行:slaveof no one
重新设置主从关系,在从机上重新指定主机,执行命令:slaveof 主机ip 主机端口
10.小结
1)查看主从复制关系命令:info replication
2)设置主从关系命令:slaveof 主机ip 主机端口
3)断开主从关系:slaveof no one
Redis哨兵模式
哨兵模式:主机宕机,从机上位自动版
1.搭建好一主二从集群架构
2.提供哨兵配置文件:
在redis安装目录下创建配置文件:vim redis_sentinel.conf
文件内容为:sentinel monitor dc-redis 127.0.0.1 6379 1
3.启动哨兵服务:redis-sentinel redis_sentinel.conf
4.主机宕机后,在恢复,自动成为新主机的从机。
5.小结
1)查看主从复制关系命令:info replication
2)设置主从关系命令:slaveof 主机ip 主机端口
3)开启哨兵模式:redis-sentinel sentinel.conf
4)主从复制原则:开始时全量复制,之后是增量复制
5)哨兵模式三大任务:监控、提醒、自动故障迁移
Jedis
java连接redis数据库
1.创建maven项目,添加依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
2.创建创建jedis对象
参数是:连接主机的ip和redis服务的端口
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)