Redis简介
Redis是一种数据库,能够存储数据,管理数据的一种软件。
数据库应用的发展历程
单机数据库时代:一个应用,一个数据库实例 缓存、水平切分时代: 读写分离时代 分表分库时代(集群): 关系型数据库: oracle、mysql、DB2、sql server、 非关系型数据库(NoSql):彻底改变底层存储机制。不再采用关系数据模型,而是采用聚合数据结构存储数据 redis、 mongoDB、 HBase.....
Redis的特点
1、支持数据持久化 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 2、支持多种数据结构 Redis不仅仅支持简单的key-vale类型的数据,同时还提供ist,set,zset,hash等数据结构的存储。 3、支持数据备份 Redis支持数据的备份,即 master-save模式的数据备份。
Redis的使用
安装
启动
1)前台启动:在任何目录下执行 redis-server 2)后台启动:在任何目录下执行 redis-server & 3)启动 redis服务时,指定配置文件: redis-server redis.conf &
关闭
1)、通过kill命令: ps -ef | grep redis查看pid kill -9 pid 2)、通过 redis-cli命令关闭: redis-cli shutdown
redis客户端
redis的客户端:用来连接 redis服务,向 redis服务端发送命令,并且显示 redis服务处理结果 redis-cli:是 redis自带客户端,使用命令 redis-cli就可以启动 redis的客户端程序 ./mysql -uroot -p 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
配置文件
redis的配置文件
在 redis根目录下提供 redis.conf配置文件;可以配置一些 redis服务端运行时的一些参数;如果不使用配置文件,那么 redis会按照默认的参数运行,如果使用配置文件,在启动 redis服务时必须指定所使用的配置文件
1)、 redis配置文件中关于网络的配置 port:指定 redis服务所使用的端口,默认使用6379 bind:配置客户端连接 redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以;一般情况下,都会配置一个ip,而且通常是一个真实 如果配置了port和bind,则客户端连接 redis服务时,必须指定端口和ip
redis-cli -h [bind指定ip] -p [port指定端口号] redis-cli -h [bind指定ip] -p [port指定端口号] shutdown 关闭redis
tcp-keepalive :TCP连接保活策略
Redis常规配置
loglevel:配置日志级别,开发阶段配置debug ,上线阶段配置notice或者warning
logfile:置顶日志文件。redis在运行过程中会出输出一些日志信息,默认情况下,这些日志信息会输出到控制台,我们可以使用logfile配置日志文件,使redis把日志信息输出到指定文件中,指定的文件可以不存在,目录必须存在。
databases:配置redis服务默认创建的数据库实例,默认是16个
Redis安全配置
requirepass : 配置redis 的访问密码,默认不使用。此参数必须在protected-mode = yes 时才起作用 一旦设置了密码验证,客户端连接redis服务时候,必须使用密码连接,redis-cli -h ip -p port -a pwd
1、测试reids性能 redis-benchmark
2、ping查看redis服务是否正常运行 返回Pong 说明正常
3、查看redis服务器的统计信息 info 查看redis服务器的所有信息 info [信息段] 查看redis服务器的指定统计信息,如:info Replication
4、redis的数据库实例 作用类似于mysql的数据库实例,reids中的数据库实例只能由redis服务创建和服务,开发人员不能修改和自行创建数据库实例,默认情况下,redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15,使用时通过编号来使用数据库;可以通过配置文件,指定redis自动创建数据库个数;redis的每一个数据库实例本身占用的存储空间是很少的,所以也不会造成存储空间的太多浪费 默认情况下,redis客户端连接的是编号是0 的数据库实例;
5、查看当前数据库实例中所有key的数量:dbsize
6、查看所有key:keys *
7、清空当前数据库实例的数据:flushdb
8、清空所有的数据库实例的数据:flushall
9、查看redis的所有的配置信息:config get * 查看redis 的指定配置信息:config get [信息名]
redis的五种数据结构
程序是用来处理数据的,Redis是用来存储数据的,程序处理完的数据要存储到redis中,不同特点的数据要存储在Redis中不同类型的数据结构中。
| 数据类型 | ||
|---|---|---|
| 字符串 | zahngsan 20 true | String(单key : 单value) |
| list列表 | 13333333333 zs@163.com 321321 | list(单key : 多value 有序) |
| set集合 | shanghai zhengzhou tianjing suzhou | set(单key : 多value 无序) |
| pojo | id:1001,name:zhangsan,age:20 | hash(单key : 对象[属性:值] 无序) |
| zset(单key : 多value 可排序) |
redis中操作命令
有关key 的操作命令
keys [pattern] 查看数据库中的key
keys * :查看所有的key,
keys k*:查看数据库中所有以k开头的key
keys h*l:查看数据库中所有以h开头l结尾的key
keys h?l:查看数据库中所有以h开头l结尾,且中间只有一个字符的key
keys h[abc]llo:查看数据库中所有以h开头,llo结尾,且h后面只能取abc中的一个字符的key
exists key 判断key在数据库中是否存在,如果存在则返回1,反之,返回0 exists key [key1 key2 key3] 返回key存在的数量 exists k1 exists k1 k2 k3 hello
move key index:移动指定key到指定的数据库实例中 move k 1 :将key为k的数据移动到1号数据库实例中
ttl:查看指定key的剩余生存时间,如果不存在key,返回-2,如果key没有设定生存时间,返回-1
expire key seconds:设置key的最大生存时间 expire hello 20
type key : 查看指定key的数据结构类型
rename key newkey : 重命名key
del key : 删除指定的key del key [key1 key2 key3] :删除多个key,返回值是删除成功的数量
有关string类型数据的操作命令
set 键 值 : 将string类型的数据放置到redis中,set 键 值,如果key已存在,则覆盖 set name zhangsan set age 20 set totalRows 100
get key : 获取string类型的数据 get name get age get totalRows
append key value :追加字符串,返回追加之后的字符串长度,如果key不存在,则相当于set
strlen key : 获取字符串长度
incr key :将字符串数值进行加1运算,返回加后的结果,如果key不存在,则设置该key,初始化为0,进行加1
decr key : 将字符串数值进行减1运算,
incrby key offset : 将字符串数值进行加offset运算
decrby key offset :将字符串数字进行减offset运算
getrange key startIndex endIndex :获取字符串中的子字符串,自左向右,最左边的下标是0, 自右向左,最右边的下标是-1
hello: wrod getrange hello 1 3 返回 rod getrange hello 1 -1 返回 rod getrange hello 0 -1 返回 wrod
setrange key offset value :用value 覆盖下标为offset开始的字符串
setex key seconds value :设置字符串数据的同时,设置他最大生命周期
setnx key value :设置一个不存在的key,成功返回1,失败,返回0
mset key value [key1 value1 key2 value2 .....] : 批量设置key
mget key [key1 key2 key3] : 批量获取指定key的值
msetnx key value [key1 value1 key2 value2 .....] :批量设置不存在的key,当所有key均不存在,设置成功,反之失败
有关list类型数据的操作命令
lpush key element [element.....] :将一个或者多个值依次插入到列表的表头 lpush list 1 2 3 4 = 4 3 2 1
rpush key element [element.....] :将一个或者多个值依次插入到列表的表尾
lrange key start stop :获取指定列表中指定下标区间的元素 lrange list 0 -1 = 4 3 2 1
lpop key [count] :从指定列表中移除指定个数的,表头元素,并返回表头元素
rpop key [count] :从指定列表中移除指定个数的,表尾元素,并返回表尾元素
lindex key index :获取指定列表,指定下标元素
llen key : 获取指定列表的长度
lrem key count element :根据count的值,来移除列表指定数据 lrem list 2 1 从列表左侧开始删除两个1 lrem list -2 1 从列表右侧开始删除两个1 lrem list 0 1 从列表删除所有的1
ltrim key start stop :截取指定列表中指定下标区间的元素组成的新列表,并赋值给key lpush list 1 2 3 4 5 6 7 结果 7 6 5 4 3 2 1 ltrim list 1 -2 结果6 5 4 3 2
lset key index element : 更改将指定列表中指定下标的值
linsert key BEFORE|AFTER pivot element :将element 插入到指定列表中位于pivot元素之前/之后的位置
有关set类型数据的操作命令
sadd key member [member....] : 将一个或多个元素添加到指定set中,元素有重复,则忽略。
smembers key :获取指定set中的所有元素
sismember key member:判断元素是否在指定set中存在,返回1 则存在,0则不存在
scard key :获取指定集合的长度
srem key member [member ...] :移除指定集合中的一个或者多个元素,不存在的元素会被忽略,返回成功移除的个数
srandmember key [count]:随机获取指定集合中一个或count个元素, count为正数时,获取的多个元素之间不重复 count为负数时,获取的多个元素之间可能重复
spop key [count] : 随机移除一个或多个元素
smove source destination member : 将指定集合中的指定元素移动到另一个集合 smove set set1 zhanggei :将set中的zhangei元素移动到set1中
sdiff key [key ...] :差集 :返回 属于第一个key,但不属于 其他key 的 元素
sinter key [key ...] : 交集 :返回所有指定集合都有的元素
sunion key [key ...] : 并集 :返回指定的所有key元素
有关hash类型数据的操作命令
hset key field value [field value ......] :将一个或者多个field-value设置到哈希表中 hset hash name zhangsan age 20
hget key field :获取一个哈希表里的field的值 hget hash name hget hash age
hmset key field value [field value ......] :批量设置多个field-value对到哈希表中
hmget key field [field] :批量获取指定key 的field的值
hgetall key :获取指定哈希表中所有的field 和 value
hdel key field [field ....] :删除指定哈希表中指定field
hlen key :获取指定哈希表的filed个数
hexists key field :判断指定哈希表中是否存在某一个field
hkeys key :获取指定哈希表中所有的field列表
hvals key : 获取指定哈希表的所有field
hincrby key field increment :对指定哈希表中的指定field进行整数加法运算
hincrbyfloat key field increment : 对制定哈希表中的指定field进行浮点数加法运算
hsetnx key field value :将一个field - value 设置到哈希表中,如果field已经存在,放弃设置,反之设置
有关zset 类型数据的操作命令
zset每一个元素都要关联一个分数,redis 会根据分数对元素进行自动排序,分数可以重复,元素不能重复,每个元素都有下标
增
zadd jet [NX|XX] [GT|LT] [CH] [INCR] score member | score member ... :讲一个或者多个member及其score值加入有序集合,如果元素已存在,则分数覆盖 zadd score 100 zhangsan 80 lisi 72 zhaosi 70 wangwu 60 wanglu
查
zrange key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES] :获取指定有序集合中指定下标区间的元素 zrange score 0 -1 zrange score 0 -1 withscores : 附带分数
zrangebyscore key min max [WITHSCORES] [LIMIT offset count] :获取指定有序集合中指定分数区间的元素
zcard key :获取指定有序集合中所有元素的个数
zrank key member :获取指定有序集合中指定元素的排名
zrevrank key member :获取指定有序集合中指定元素的排名(从大到小),rev代表相反,在其他zset命令道理同等
zcount key min max :获取指定有序集合中分数在指定区间内的元素的个数
zscore key member : 获取指定有序集合中指定元素的分数
删
zrem key member [member ...] :删除指定有序集合中一个或者多个元素
Redis持久化
redis 提供持久化策略,在适当的实际采用适当的手段把内存中的数据持久化到磁盘中,每次redis服务启动时,都可以吧磁盘上的数据再次加载到内存中使用。
1、RDB策略:在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作,RDB策略是redis默认的持久化策略,redis服务开启时,该策略也跟着默认启动。
save
2、AOF策略:采用操作日志来记录进行每一此写操作,每一次启动redis,都会重新执行一遍操作日志中的指令,redis默认不开启AOF功能。 appendonly:配置是否开启AOF策略 appendfilename:配置操作日志文件
小结:根据数据的特点,决定开启那总持久化策略,一般情况下,开启RDB足够了
Redis的事务
事务:把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,yao'm同时失败
Redis事务:允许把一组redis命令放在一起执行,把命令进行序列化,然后一起执行,保证部分原子性,
multi:用来标记一个事务的开始;之后每一次操作,都会放入队列中,不会立刻执行
exec:执行一个事务,用来执行事务队列中的所有操作 如果一组命令中,在压入事务队列过程中就发生的错误的命令,则本事务的所有命令都不执行,能够保证事务的原子性。
如果一组命令中,在压入队列过程中正常,的男士在执行事务队列过程中某一条命令发生的错误,则只会影响发生错误的命令,不会影响其他命令的执行,不能够保证事务的原子性。
discard:清除所有已经压入队列的命令,并且结束整个事务
watch :监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行,否则正常执行
unwatch:放弃监控所有的键
小结
1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断
2、不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,reds的事务没有回滚。 Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Reds不需要事务回滚的能力。
redis消息的发布与订阅
redis客户端订阅频道,消息的发布者往频道上发布信息,所有订阅此频道的客户端都能够接好到信息。
subscribe channel [channel ...] :订阅一个或者多个频道的消息 subscribe s1 s2 s3
psubscribe pattern [pattern ...] :订阅一个或者多个频道的信息,频道名支持通配符 psubscribe news.*
publish channel message:将消息发布到指定的频道 publish s1 xinxi
redis的主从复制
主从复制
主机数据更行后根据配置和策略,自动同步到从机的master/slave机制,Master以写为主,Slave以读为主。
查看三台redis服务在集群中的主从角色 info replication 默认情况下,所有的redis服务都是主机
设置主从关系 在6380上执行:slaveof 127.0.0.1 6379 :从属于某一个redis服务,从机不能进行写操作,但是可以读。
全量复制:一旦主从关系确定,主机会将自己的数据同步到从机上
增量复制:主机写数据会自动到从机
主机宕机
如果主机宕机,从机原地待命,仍然可以进行读操纵。当主机上线后,恢复正常
从机宕机
如果从机宕机,其他从机不受影响,主机的从机数量减一,当从机恢复,则主从关系失效,需要重新设置主从关系。
从机上位
从机断开原来的主从关系,slaveof no one 将其他从机从属于新主机,slaveof ip port
如果原来主机恢复,可以重新设置为主机,也可以设置为从机,或者为从机的从机
小结
一台主机配置堕胎从机,一台从机又可以配置多台从机,从而形成一个庞大的集群结构。减轻一台主机的压力,但是增加了服务间的延迟时间
Redis哨兵模式
主机宕机、从机自动上位
提供哨兵配置文件
在redis安装目录下创建配置文件: redis_sentinel.conf,编辑内容
sentinel monitor dc-redis 127.0.0.1 6379 1
表示,指定监控主机的ip地址,port端口,得到哨兵的投票数(当某一个从机得到的票数大于或等于次数时,切换从主关系)
启动哨兵 : redis-sentinel /redis目录/redis_sentinel.conf
redis-sentinel redis_sentinel.conf
主机宕机,哨兵选择一个从机上位,之前主机恢复,自动从属于新的主机
Jedis操作Redis
使用Redis官方推荐的Jedis,在java应用中操作Redis,Jedis几乎涵盖了Redis的所有命令,操作Redis的命令在Jedis中以方法的形式出现
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
@Test
public void test1(){
//连接redis
Jedis jedis = new Jedis("114.215.172.169",6379);
String ping = jedis.ping();
System.out.println(ping);
String set = jedis.set("name", "zhangsan");
System.out.println(set);
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
Boolean name = jedis.exists("name");
System.out.println(name);
}

Comments | NOTHING