redis

redis安装目录: /usr/local/bin。
redis-server:redis服务器启动命令。 redis-cli:进入redis数据库的命令。
redis.conf配置文件在 /etc下。

1.【redis的启动方式:】
1.1.前台启动: 在redis的目录下 redis-server即可开启redis。缺点:关闭窗口后redis关闭。
1.2.后台启动(推荐):复制redis解压包下的redis.conf到其他目录。cp redis.conf /etc/redis.conf --复制到etc下,名为redis.conf。vi 修改复制的redis.confdaemonize no 改成 yes。
命令启动redis-server /etc/redis.conf ----复制的redis的相对路径。 我的是/etc/redis.conf
ps -ef |grep redis --查看redis的状态。
redis关闭:在liux下用redis-cli shutdown 。
在linux下redis-cli -p 6379 shutdown ,断开redis。
在redis下 shutdown shell直接断开虚拟机连接,不推荐。


2.redis有0-15号库。 默认使用0号库。select 库号, 切换库。

dbsize:查询当前数据库的key数量:
flushdb:清空当前库数据

 


--------------------------------
【6】redis五大常用数据类型:key操作: 1.redis字符串(String) 2.redis列表(List) 3.redis集合(Set) 4.redis哈希(hash)5.redis有序集合(zset)

6.1.redis字符串:String是redis最基本的类型。String是二进制安全的。 value的值为一个。相同key内容会被覆盖。
set key value:数据的插入:
keys * :查询所有key:
type key:查询key的类型:
exists key :查询key是否存在
del key / unlik key:删除key
expire key num 设置key过期时间为num秒。
ttl key:查看还有多少秒过期: -1表示永不过期,-2已经过期。
get key :查询对应value。
append key value --将value追加到原key对应value的末尾。
strlen key :获取值的长度。
( incr key --value数值+1 。 decr key--value数值-1。incrby/decrby key 步长--给key的value + / - 步长的值。 )
(m=more):mset key value key value--设置多个keyvalue。
mget key key:取出多个value。
msetnx key value key value: 设置多个keyvalue,如果key不存在则成功,如果存在则失败。
setex key 过期时间 值:设置新的值的过期时间。
getset key value:以新值换旧值,将key的value改变。
---------------------------------

6.2.redis列表:单键多值:底层是一个双向链表,对两端操作性很高,对中间操作性差。value的值为多个。
lpush/rpush key value1 value2.. 从左边/右边加入数据。 eg: lpush k1 v1 v2 v3: v3-->v2-->v1 顺延, rpush也是顺延。
lrange key 0 -1 查询所有数据(0表示第一个元素index,-1表示最后一个元素index)
lpop key:查询取出key最做边的元素。 rpop key :查询取出key最右边的元素。
rpoplpush key1 key2 :将k1最右边的元素取出插入key2最左边。
lindex key index:查询key index下标数据
linsert key before "value1" "newvalue":在key的value1处前从左边插入newvalue值。

6.3.set集合:是string类型的无序集合,底层是一个value为null的hash表,所有操作复杂度都是O(1)。 ---------------元素不可重复
sadd k v1 v2:添加数据。
smembers key:查询元素
sismember key value:判断当前key中是否含有该value
scard key:返回集合个数
srem key value1 value2.. :删除集合中某个元素。
spop key 随机吐某一个值,相当于删除。
srandmember key n :随机从集合中取出n个值,不会删除元素。
smove k1 k2 v1:将k1的v1移到k2中。
sinter k1 k2 :k1 k2的交集
sunion k1 k2:并集
sdiff k1 k2: 差集

6.4.redis哈希(hash):键值对集合。 是一个string类型的field和value映射表,特别适合存储对象,类似:map<String,object>
<key filed value>
格式:user:1001 name zhangsan age 35 ------key=user:1001 , filed: name, age ,value:zhangsan ,35
hset key field value:添加单个数据。
hmset key filed1 value1 filed2 value2:添加多个数据
hget key field:查询key对应filed的value
hexists key field:查询field是否存在
hkeys key:列出所有field
hvals key :列出所有field的value
hincrby key filed num: value+num

6.5.redis的有序集合Zset:没有重复元素的 (根据score排序) :key score v1
格式: k1 100 java 20 php 15 python 68 c++ -------k1为key,score为排序的值, v1为value
zadd key score1 value1 score2 value2....:添加数据
zrange key start stop (withscores):根据score查询数据并排序(显示score)。 --start stop为index ,0 -1查询所有
zrangebyscore key score1 score2(withscores): 查询在【score1,score2】里的数据。
zincrby key num value: 给value的score加上num。
zrem key value :删除该value的值。
zcount key score1 score2:统计[score1,score2]中的元素个数。
zrank key value :返回value在集合的排名,从0开始。

7.redis的发布和订阅:
开启多个linux会话,均开启redis服务, 进入redis中 ,一个会话订阅 SUBSCRIBE channel1(订阅名), 另外的会话 发布publish channel1 hello(发布内容) 。 在订阅的会话会显示mssage,订阅名和发布内容。
发布消息没有 持久化。


8.redis新的数据类型。
8.1.Bitmaps:做二进制运算, 用于获取访问网站的活跃,如果两天连续访问,设置对应用户偏移量的值为1,两天做与运算。
格式:setbit key offset value -------------offset表示偏移量,从0开始,相当于index角标。 value设置偏移量的值,0/1.
setbit key offset value-- 设置偏移量。 eg :setbit user1001 1 1 ,setbit user1001 8 1 。-----偏移量0-8,表示偏移量为1的值为1,偏移量为8的值为1,其余偏移量为0. 不存在的偏移量也为0.
getbit key offset : 获取偏移量的值。
bitcount key (start end):获取偏移量为1的总数 (偏移量在[start -end]之间的为1的值)
bitop and key1 key2:获取key1key2偏移量均为1的总数。

8.2.HyperLogLog:用于基数(不重复元素)计算的操作。
pfadd key value value....:加入元素 。重复元素不添加。
pfcount key:获取元素个数
pfmerge key key1 key2:将key1,key2合并加入到key中

8.3.Geospatial:为元素添加二维坐标(x,y),相当于经纬度。
geoadd key xkey ykey value:添加元素, xkey为经度,ykey为维度。
geopos key value:获取key值。
geodist key value1 value2 单位[m/km/ft/mi] :获取key中 value1与value2的直线距离,根据经纬度计算。(value1 value2在key中)
georadius key xkey ykey radius 单位:以给定的xkey,ykey为中心,半径为radius的区域,在key中找到所在radius区域的元素

9.Jedis操作redis:在idea中导入jedis的依赖,new一个Jedis对象:Jedis jedis=new Jedis("虚拟机ip",6379)。 通过jedis.方法 对redis进行操作, 方法与redis中大的方法一样。

10.springboot整合redis:导入starter-redis。 配置redis的连接信息。 配置redis类。 通过配置的redis对象(redisTemplate)进行对redis的操作。
redisTemplate.opsForvalue().set("key","value")--插入redis。redisTemplate.opsForValue().get("key1");获取redis中的值
redisTemplate.opsForvalue()相当于开启redis操作


11.redis事务:不会被其他客户端发来的请求所打断。事务中顺序执行,防止别的命令插队。
multi:开启事务,然后写命令组队,放进事务队列中(TX)。
exec:表示组队成功。事务创建并执行。
discard:放弃组队。事务不创建。
事务错误的原因:1.组队中如果有任何一个命令失败(编译不通过),exec事务都不会执行(报错)。
2.组队中命令编译通过,但逻辑不通过, exec后事务会执行,但逻辑错误的命令不会执行。 (给字符串的值 incr--逻辑不通过)
事务冲突的问题:乐观锁(提高吞吐量)与悲观锁。
redis的乐观锁:watch key:开启对key的监视。(在多个会话中都开启监视) , 然后每个绘画都开启事务multi,此时所有会话该key的版本都是一样的, 如果有会话对key的值进行修改,
那么key版本提高 ,其他会话版本与key不匹配,所以事务关闭,不能执行。


12.RDB持久化(redisdatabase):每隔一段时间将内存中的数据集快照写入磁盘(dump.rdb)。缺点:最后一次持久化数据后出现宕机,写入的数据可能会丢失。
原理: rdb持久化是以fork的写时复制技术,在内存中创建一个临时文件,save设置的时间到了,就会将数据写进该临时文件,然后临时文件转化为rdb内存文件。 redis默认开启RDB持久化。

13.AOF持久化:以日志的形式来记录每个写操作。只许追加文件,不可改写文件。AOF与RDB都开启之后,默认听AOF。 默认不开启AOF, 在redis.conf中将appendonly 改为yes开启aof。开启之后在bin下有一个aof文件。
客户端的请求写命令会被追加到aof缓冲区,缓冲区根据aof持久化策略将写命令同步到磁盘的aof文件中,当aof文件大小超过设置的时,就会替换原有aof文件。

14.主从复制:读写分离,一主多从。向一台主机写数据,该主机向多台从机复制数据,从机只能读取数据不能写数据。
1.主从机的配置,复制redis.config到其他文件下, vi 创建几个redis***.conf文件,并在该文件内 include /myredis/redis.conf
pidfile /var/run/redis_***.pid
port 端口号自定义
dbfilename dump***.rdb
2.redis-server -p 多口号,打开对应端口号的redis。
3.在从机中slaveof <ip><port> 设置为该ip下的port端口号的redis的从机。
4.info replication 查看主从信息。

14.1一主二仆:
1.当从服务器挂掉之后,重启该服务器时,该服务器不再是从服务器。 重新设置为从机后,主机的内容在从机中全能看见。
2.当主服务器挂掉之后,从机依旧是从机,主机重启还是主机。

14.2薪火相传:B是A的从机,C是B的从机,那么C也是A的从机。
14.3反客为主:当主机挂掉后,在从机 slaveof no one 。从机变为主机

14.4.哨兵模式:当主机挂掉之后,在主机中选择一个当选新主机,当挂掉的主机重启之后,会变成从机。 主从机数是多少,配置文件配置。
在从机配置文件目录下新建sentinel.conf文件,添加sentinel monitor mymaster 主机ip 主机redis端口号 1(mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量),
redis-sentinel /myredis/sentinel.conf执行配置文件开启哨兵模式。 如果主机挂掉之后会在从机中随机选出一个当主机(根据优先级)。原主机重启变为从机。

15.redis集群:多个redsi合成一个集群,变成多个主从组,根据插入的key计算插槽值,调用对应插槽的主从组进行插入操作。

16.缓存穿透:查询一个不存在的数据,由于缓存时不命中时需要从数据库查询,查不到数据则写不入缓存,导致查找不存在的数据时每次都要访问数据库,大量访问不存在的数据,造成服务器崩溃。

17.缓存击穿:1数据库访问瞬时间增加。2.redis里的大多key并没有过期。3.redis正常运行。
原因:redis中某个key过期了,大量访问这个key的请求都去访问数据库。造成数据库崩溃。

18.缓存雪崩:1.数据库压力变大,服务器崩溃。
原因:在极少的时间端,大量key过期,数据库访问压力增大。

19.redis实现分布式锁(nx):
setnx key value 给key上锁,其他人对key不能进行操作, 删除key释放锁。
expire key num 上锁之后,设置key过期时间,自动释放锁。
set key value nx ex num:给key上锁,并设置过期时间为num。

 


20.redis内存满了之后,会移除内部数据。 移除规则通过maxmemory-policy来指定。

 

 

21:数据库事务的四大特性: 1.原子性:事务对数据库的操作要么全部成功,要么全部失败。 2.一致性:事务执行之前和执行之后都必须处于同一状态。3.隔离性:事务开启后不能被其他操作所干扰,多个事务之间相互隔离。4.持久性:事务一旦被提交,它对数据库中数据的改变是永久的。

posted @ 2021-12-15 19:57  Martin,Yu  阅读(113)  评论(0)    收藏  举报