初识redis
1.redis启动服务的细节
注意: 直接使用./redis-server方式启动使用的是redis-server这个shell脚本中的默认配置
2.如何在启动redis时指定配置文件启动
注意:默认在redis安装完成之后再安装目录没有任何配置文件,需要在源码目录中复制redis.conf配置文件到安装目录
a.进入源码目录
cp redis.conf /usr/local/redis
b.进入/usr/local/redis安装目录查看复制配置文件
cd /usr/local/redis
ls
c.进入bin目录加载配置启动
./redis-server ../redis.conf
3.修改Redis默认端口号
vim redis.conf 修改里面port 7000 保存并退出
4.Redis中库的概念
库:datebase用来存放数据一个基本单元 一个库可以存放key-value键值对 Redis中每一个库都有一个唯一名称|编号 从0开始
默认库的个数:16个库 库的编号:0-15 默认使用的是0号库:
切换库的命令:select dbid(库编号)
5.Redis中清除库的指令:
flushDB 清空当前库
flushAll 清空所有库
6.操作key相关的指令
1.del key[key ...]
2.exists key [key ...] 存在多个时,只要有一个存在返回1否则返回0
3.expire key seconds
作用:为了给key设置一个生存时间,当key过期时(生存时间为0),它会自动删除
4.keys * 查询所有的key
(* 匹配任意个数任意字符 ?匹配仅一个任意字符 []匹配的是里边指定的某一个字符)
5.move
作用:将当前数据库的key 移动到指定的数据库db 中(move key db)
小插曲:
展示中文存的value 这需要在客户端登录时外加 --raw (如:./redis-cli -p 6379 --raw)
6.pexpire
作用:它与expire作用差不多,但它是以毫秒为单位设置key的生存时间,expire是以秒为单位
7.pexpireat key Unix的时间戳
8.ttl key
作用:用来返回当前key的剩余生存时间
返回-1 的key都是永久存储的
返回-2 代表当前的key不存在
返回>=0 就代表剩余生存时间
9.pttl key 返回的剩余的毫秒
10.randomkey
作用:从当前数据库中随机返回一个key(不删除)
11.rename key newkeyname 重新改key的名字,不修改里面的value
12.type key
作用:判断key所对应值的类型 如果返回为none说明当前key不存在
7.Redis类型之 string类型
key 是string类型 value也是string类型
string常用的操作命令:
命令 说明
set 设置一个key/value 如:set key value
get 根据key获取对应的value 如:get key
mset 一次性设置多个key/value 如:set name zhangsan age 18 bir 2018-08-08
mget 一次性获取多个key/value 如:get name age bir
getset 获取原始key的值,同时设置新值 如:当前库里边有name zhangsan 我getset name xiaoming 返回的值是zhangsan 但重新get name 返回的值是xiaoming
strlen 获取对应key存储value的长度 如:当前库里边有name zhangsan 我strlen name 返回的是8 (value的长度)
append 为对应key的value追加内容 如:当前库里边有name zhangsan 我append name likered 重新 get name 返回的值是zhangsanlikered
getrange 索引从零开始 截取value内容 -1代表末尾 如:getrange name 0 7
setex 设置一个key存活的有效期(秒)如:setex age 10 18 (10代表10s,18是age的值)
psetex 设置一个key存活的有效期(毫秒)
setnx 存在不做任何操作,不存在则添加 如:setnx name xiaoming 存在name,不做任何操作,不存在name这个key则进行添加
msetnx 原子操作(只要有一个存在不做任何操作)一次性设置多个key,只要有一个存在就都不保存 如:msetnx name xiaoming age 18
decr 进行数值类型的-1操作 如:当前库中存在age 18 我decr age 返回 17 可以减到负数
decrby 根据提供的数据进行减法操作 如:decrby age 10 代表每次age减去10
incr 根据数值类型+1操作
incrby 根据提供的数据进行加法操作
incrbyfloat 根据提供的数据加入浮点数 如:incrbyfloat age 1.454553454354355453454534 返回 18.45455345435435546 (当前最多保留17位小数)
Redis类型之 List类型
list列表 相当于Java中的list集合 特点 元素有序且可以重复 (可以往左放入元素 也可以往右放入元素)
小插曲: ps aux|grop redis (命令 查看进程 ) kill 8168 (杀死进程)
list常用的操作命令:
命令 说明
lpush 将某个值加入到一个key列表头部 如:lpush lists zhangsan xiaoming xiaohei lisi xiaoming(lists 代表key,它后边的值都是key的list类型存放的值)
lrange 获取某一个下标区间内的元素 如:lrange lists 0 -1 返回 xiaoming lisi xiaohei xiaoming zhangsan (注意:刚刚是从左加入的数据,所以最先加入的数据在最后显示,最后加入的数据最先展示)
rpush 将某个值加入到一个key列表尾部 如:rpush lists xiaojindou xiaoheidou xiaodoudou 再lrange lists 0 -1 返回xiaoming lisi xiaohei xiaoming zhangsan xiaojindou xiaoheidou xiaodoudou
lpushx 同lpush 但必须要保证这个key存在(每次只能在列表里放一个元素,当key不存在时,无法像lpush创建key/value)如:lpushx names aaa
rpushx 同rpush 但必须要保证这个key存在
lpop 返回和移除列表的第一个元素(左) 如:lpop lists
rpop 返回和移除列表的第一个元素(右)如:rpop lists
llen 获取列表元素个数 如:llen lists
lset 设置某一个指定索引的值(索引必须存在)就是根据下标修改指定下标的值 如:lset lists 1 xxxxx
lindex 获取某一个指定索引位置的元素 如:lindex lists 1
lrem 删除重复元素 如:lrem lists 2 zhangsan 意思是删除2个重复的zhangsan 从左边开始匹配
ltrim 保留列表中特定区间内的元素 如:ltrim lists 1 5 意思是保留第二个到第六个的元素
linsert 在某一个元素之前,之后插入新的元素 如:linsert lists before xiaoming xiaocheng 意思是将xiaocheng放在xiaoming的前边 linsert lists after xxxxx xiaojindou 意思是将xiaojindou 放在xxxxx的后边
Redis类型之 Set类型
特点:set类型set集合 元素无序 不可以重复
set常用的操作命令:
命令 说明
sadd 为集合添加元素 如:sadd sets zhangsan lisi wangwu lisi(重复的元素不会进行添加)
smembers 返回集合中所有元素 无序 如:smembers sets
scard 返回集合元素的个数 如:scard sets
spop 随机返回一个元素并将该元素在集合中删除 如:spop sets
smove 从一个集合中向另一个集合集合移动元素(两个集合都必须是set类型的集合) 如:当前有集合 ages 18 19 20 和sets zhangsan lisi 我smove sets ages zhangsan
srem 从集合中删除一个元素 如:srem ages zhangsan 18(可删除多个)
sismember 判断一个集合中是否含有这个元素 如:sismember sets zhangsan 返回0代表没有返回1代表有
srandmember 随机返回元素 如:srandmember sets 2 (意思是每次随机返回两个且不删除)
sdiff 去掉第一个集合中其他集合含有的相同元素 如:库中有 sets1 zhangsan lisi wangwu zhaoliu win7 |sets2 lisi xiaohei |sets3 win7 xiaocheng xiaoming 我sdiff sets1 sets2 (当前返回sets1(sets1去掉sets2相同的元素剩下的集合),sets1和sets2 不变)
还比如:sdiff sets1 sets2 sets3 意思是返回sets1 与sets2 sets3 去掉相同元素的剩下的集合
sinter 求交集 如:sinter sets1 sets2 返回lisi 还比如 sinter sets1 sets2 sets3 没有交集返回empty
sunion 求合集 如:sunion sets1 sets2 sets3 (去除相同元素的合集)
Redis类型之 Zset类型
特点:可排序的set集合 排序 不可重复
zset常用的操作命令:
命令 说明
zadd 添加一个有序集合元素 如:zadd zsets 10 zhangsan 9 xiaohei 8 xiaochen 100 xiaoming 15 xiaochen (后边重复的元素会覆盖前面的元素,所以xiaochen是15的这个)
zcard 返回集合的元素个数 如:zcard zsets
zrange升序zrevrange降序 返回一个范围内的元素 如:zrange zsets 0 -1 withscores (withscores 展示分数)
zrangebyscore 按照分数查找一个范围内的元素 如:zrangebyscore zsets 0 20 withscores limit 0 2 (先找符合分数0-20的元素集合在进行limit 0-2的分页)
zrank 返回排名 如:zrank zsets xiaochen (返回的是当前值在集合中排序的索引值 )
zrevrank 倒序排名 如:zrevrank zsets xiaochen (返回的是当前值在集合中倒序排序的索引值 )
zscore 显示某一个元素的分数 如:zscore zsets xiaochen
zrem 移除某一个元素 如:zrem zsets xiaochen zhangsan
zincrby 给某个特定元素加分 如:zincrby zsets 1 xiaohei (每次给xiaohei加1分)
Redis类型之 hash类型
特点:value 是一个map结构 存在key value key无序的
key(外) key(内) value
hash常用的操作命令:
命令 说明
hset 设置一个key/value对 如:hset maps name zhangsan
hget 获取一个key对应的value 如:hget maps name
hgetall 获得所有的key/value对 如:hgetall maps
hdel 删除某一个key/value对 如:hdel maps bir
hexists 判断一个key是否存在 如:hexists maps bir
hkeys 获得所有的key 如:hkeys maps
hvals 获得所有的value 如:hvals maps
hmset 设置多个key/value 如:hmset maps bir 2018-10-10 address beijing
hmget 获取多个key/value 如:hmget maps bir address
hsetnx 设置一个不存在的key的值 如:hsetnx maps course redis (key(内) 存在不做处理 key不存在则添加)
hincrby 为value进行加法运算 如:hincrby maps age 10 (value必须是数值型的)
hincrbyfloat 为value加入浮点值 如:hincrbyfloat maps age 10.2343545434324343544565654 (原值加浮点值,且保留十七位)
======================================
小插曲:Redis图形化管理工具
开启Redis远程连接
注意:默认Redis服务器是没有开启远程连接,也就是默认拒绝所有远程客户端连接
1.修改配置开启远程连接
vim redis.conf 修改如下配置
bind 0.0.0.0 #允许一切客户端连接
2.修改配置之后重启Redis服务
./redis-server ../redis.conf 注意:一定要加载配置文件启动
=======================================
8.Redis 持久化机制
client redis[内存]-->内存数据--数据持久化->磁盘
Redis提供两种不同的持久化方法来将数据存储到硬盘里面分别是:
1.快照(snapshot)
2.aof (append only file) 只追加日志文件
1.1快照
特点:这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是Redis的默认开启持久化方式,保存的文件是以.rbd形式结尾的文件,
因此这种方式称之为rdb方式。
快照生成方式:
1.客户端方式:bgsave 和save命令
2.服务器配置自动触发
1.1客户端方式-bgsave
-a.客户端可以使用bgsave 命令来创建一个快照,当接收到客户端的bgsave命令时,Redis会调用fork`来创建一个进程,然后子进程负责将快照写入磁盘中,
而父进程继续处理命令请求。
名词解释:fork当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类Unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到
父进程或子进程对内存进行了写之后,对被写入的内存的共享才结束服务。
小插曲:删除文件命令 rm -rf dump.rdb 查看文件 ll 生成快照 bgsave(background saving started)【fork 进行】|save(ok)【主线程对外阻塞进行,无法对外提供服务】
1.2客户端方式-save【不常用】
-b.接受到save命令的Redis服务器在快照创建完毕之前将不再响应任何其他的命令。
1.3服务器配置方式-满足配置自动触发
-如果用户在redis.conf设置了save配置选项,redis会在save选项条件满足之后自动触发一次bgsave命令,如果设置多个save配置选项,当任意一个save配置选项条件满足,redis也会触发一次bgsave命令
1.4服务器接受客户端shutdown命令
-当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不在执行客户端执行发送的任何
命令,并且save命令完毕之后关闭服务器
1.5配置生成快照名称和位置
1.修改生成快照名称
-dbfilename dump.rdb
2.修改生成位置
-dir ./
2.1 aof只追加日志文件
1.特点
这种方式可以将所有客户端执行的写命令记录到日志文件中,aof持久化会被执行的写命令写到aof的文件末尾,以此来记录数据发生的变化,
因此只要redis从头到尾执行一次aof文件所包含的所有写命令,就可以恢复aof文件的记录的数据集。
2.开启aof持久化
在redis的默认配置中aof持久化机制是没有开启的,需要在配置中开启
2.1开启aof持久化
-a 修改appendonly yes 开启持久化
-b 修改appendfilename "appendonly.aof" 指定生成文件名称
小插曲:tail -f appendonly.aof 实时展示
日志追加频率
1.always 【谨慎使用】 每个redis写命令都要同步写入硬盘,严重降低redis进度
2.everysec【推荐】每秒执行一次同步显示的将多个命令到磁盘
3.no【不推荐】 由操作系统决定何时同步
adb与aof同时开启,redis会优先选择aof这种方式进行持久化,因为它更加安全。但也有缺点,随着时间的流逝,aof里放的文件写入数据重复磁盘占用较大。
为了解决aop的这种缺陷,redis提供了aof重写(rewriter)机制
aof重写:用来在一定程度上减小aof文件的体积
触发重写方式
1.客户端方式触发重写
-执行bgrewriteaof 命令
2.服务器配置方式自动触发
-配置redis.conf 的auto-aof-rewrite-percentage选项
重写的原理:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的文件这点和快照有点相似。
用户还应该对持久化的文件进行备份(最好备份在多个不同的地方)
9.Java操作redis
1.引入:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
2.创建jedis对象
public static void main(String[] args){
//1.创建jedis对象
Jedis jedis=new Jedis("192.168.139.128",6379);//1.redis服务必须关闭防火墙2.redis服务必须开启远程连接
jedis.select(0);
//2.执行相关操作
//......
//3.释放资源
jedis.close();
}
10.SpringBoot操作redis
spring boot data(数据) redis中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTemplate的
子类,两个方法基本一致,不同之处主要体现在操作的数据类型不同,**RedisTemplate中的两个泛型都是Object,意味着存储的
key和value都可以是一个对象,而StringRedisTemplate的两个泛型都是String,意味着StringRedisTemplate的key和value都只能
是字符串。
注意: 使用RedisTemplate默认是将对象序列化到redis中,所以放入的对象必须实现对象序列化接口。
10.1环境准备
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置application.propertie
spring.redis.host=182.168.139.128
spring.redis.port=6379
spring.redis.database=0
小插曲: 在redis.conf 配置文件中 输入/bind (意思是搜索bind关键字)
3.使用RedisTemplate key和value都会被序列化,所以第一实体类需要实现序列化接口,第二因为存的是序列化的key,
终端就不好操作序列化的key,所以就需要把key的object序列的方案改成String类型,这样终端就好进行操作了。
//修改key 序列化方案
redisTemplate.setKeySerializer(new StringRedisSerializer());
//修改hash key 序列化方案
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
里边调用的api:redisTemplate.opsForxxxx
stringRedisTemplate.opsForxxxx
redisTemplate.xxxx
stringRedisTemplate.xxxx
4.绑定api spring data 为了方便我们对redis进行更加友好的操作 因此有提供了bound api 简化操作
有这样一种情况:
如果以后有对一个key要做n多种操作,可以对它进行绑定处理。
里边调用的api:redisTemplate.boundxxxxOps
stringRedisTemplate.boundxxxxOps
11.redis 的应用场景
1.利用redis中字符类型完成, 项目中手机验证码存储的实现
2.利用redis中字符串类型完成 具有失效业务功能 12306 淘宝 订单还有:30分钟
3.利用redis分布式集群系统中session共享 memcache 内存 数据存储上限 数据类型比较简单 redis 内存
4.利用redis zset类型 可排序set类型 元素 分数 排行榜之类的功能
5.利用redis 分布式缓存 实现
6.利用redis 存储认证之后token信息 微信小程序 微信公众号 |用户 openid -->令牌
7.利用redis 解决分布式集群系统中分布式锁问题 jvm syschronize