redis 方法详解 Redis基本知识

1.remote dictionary server 远程字典服务,c语言编写,nosql ,默认端口6379,今天小编就来聊一聊关于redis 方法详解 Redis基本知识?接下来我们就一起去研究一下吧!

redis 方法详解 Redis基本知识

redis 方法详解 Redis基本知识

1.remote dictionary server 远程字典服务,c语言编写,nosql ,默认端口6379

2.特点

1.内存存储,持久化(rab,aof)

2.redis是单线程的

3.redis 默认有16个数据库,默认是用的是第零个数据库使用 select 3 切换,DBSIZE 查看数据库大小

4. 基本命令

String

DBSIZE 查看当前数据库大小

select 3 切换数据库

keys * 查看数据库搜有的key

flushdb 清空当前的数据库

flushall 清空所有的数据库

set name kaungshen 设置key,value

get name 通过key获取值

exists name 查询key是否存在

move name 1 把key移动到1 数据库

expire name 10 设置10秒过期

ttl name 查看剩余有效时间 -2 标识已经过期

type name 查看key的数据类型

append key "hello" 追加value值,如果可以不存在则新建

strlen key1 查看字符串长度

incr views 自增加一

decr views 自减减一

incrby views 10 步长,每次加10

decrby views 5 步长,每次减5

getrange key 0,3 截取字符串范围,从0到3

getrange key 0,3-1 获取全部的字符串

setrange key 1 xx 替换指定位置的字符

setex key 30 "hello" 设置key 的值为hello,30秒之后过期

setnx key "redis" 如果redis 中不存在,则设置,存在则设置失败

mset k1 v1 k2 v2 设置多个key

msetnx k1 v1 k4 v4 设置多个key 如果redis中不存在key则设置,如果有一个已存在则所有的都key设置都失败,原子性操作。

set user:1 {name:zhangsan,age:3} 设置一个user:1 对象,值为json 字符来保存一个对象

mset user:1:name zhangsan user:1:age 2 设置一个对象,给多个属性赋值

mget user:1name user:1:age 获取对象的多个值

getset key redis 如果不存在值则返回null,如果存在,则返回之前的值

List

lpush list one 从头部赋值

lrange list 0,-1 查询全部元素

lrange list 0,1 查询0到1范围的元素

rpush list four 从尾部赋值

lpop list 把第一个元素移除

rpop list 把最后一个元素移除

lindex list 1 通过下表获取值

llen list 获取list 的长度

lrem list 1 one 移除list集合中指定的值,1是数量

ltrim list 1,2 截取指定区间的元素

rpoplpush list mylist 移除列表的最后一个元素,将他移动到新的列表中

lset list 0 item 给list指定下标替换值,但该值必须存在

linsert list before "word" "other" 在list中word元素之前插入新元素

Set

sadd myset "hello" 给set集合赋值

smembers myset 查看set集合中所有的值

sismember myset hello 查看set集合中是否存在某个元素

scard myset 获取set集合长度

srem myset hello 移除set集合中的指定元素

srandmember myset 1 随机抽选指定个数的元素

spop myset 随机移除一个元素

smove myset myset2 "kuangshen" 将指定set集合的某个元素移动到另一个set集合

sdiff set1 set2 两个集合的差集

sinter set1 set2 两个集合的交集

sunion set1 set2 两个集合的并集

Hash

本质是一个map集合

hset myhash field1 kuangshen set一个具体的key-value

hget myhash field1 通过key获取value值

hmset myhash field1 hello field2 world set多个值

hmget myhash field1 field2 get多个值

hgetall myhash 获取所有的元素

hdel myhash field1 删除指定的key

hlen myhash 获取hsah表的长度

hexists myhash field1 判断字段的key值是否存在

hkeys myhsah 只获得所有的字段key

hvals myhash 只获取所有的字段value

hincrby myhash field 1 设置自增

hdecrby myhash field 1 设置自减

hsetnx myhash field hello 判断是否存在,不存在则创建,存在则创建失败

Zset

zadd myset 1 one set值,要加数字

zrange myset 0 ,-1 查看set集合元素

zrangebyscore myset -inf inf 区间查找,负无穷到正无穷,只能从小到大排序

zrangebyscore myset -inf inf withscores 同上,加上数字

zrevrangebyscore myset -inf inf 同上,是从大到小,倒序排列

zrange myset 0.-1 通过下标查找,升序排列

zrevrange myset 0,-1 通过下标查找,倒序排列

zrem myset key 移除指定元素

zcard myset 查看set 长度

zcount myset 1 3 统计下标区间内有多少元素

0(底层是一个Hset)

geoadd china:city 116.40 39.90 beijin 114.05 22.52 shenzhen //添加城市和经纬度

geopos china:city beijing shenzhen 通过城市获取经纬度

geodist china:city beijing shenzhen km 获取城市之间的距离 默认为m

georadius china:city 110 30 500 km withdist withcoord count 1 获取以110 30 经纬度半径500km范围内的城市,直线距离,经纬度,只查询一个

georadiusbymember china:city 110 30 500 km withdist withcoord count 1 同上,以城市为中心

geohash china:city beijing chongqing 返回两个城市的经纬度hash值,11位字符串

zrem china:city beijing 移除城市

zrange china:city 0,-1 获取所有元素

Hyperloglog (计数器,求两个集合的并集,去重)

pfadd mykey a b c 添加元素

pfcount mykey 统计元素

pfmerge mykey3 mykey1 mykey2 去重,获取一个新集合

Bitmap 位存储,二进制记录,0和1

setbit sign 0 1 设置第0天,值为1

getbit sign 0 获取第0天的值

bitcount sign 获取全部记录为1的数据

5.为什么redis单线程还会那么快?

redis是将所有的数据全部放在内存中,在内存中单线程操作效率是最高的,多线程是cpu上下文切换的操作,对于内存系统来说,如果没有上下文切换效率就是最高的。多次读写都是在一个cpu上的,在内存情况下这个就是最佳方案。

6.事务

redis单条命令是保证原子性的,但是事务是不保证原子性。

redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。

一次性、顺序性、排他性 执行一系列的命令

redis事务没有隔离级别的概念。

所有的命令在事务中并没有直接被执行,只有发起执行命令的时候才会被执行。exec

redis事务:

开启事务(multi)

命令入队

执行事务(exec)

取消事务(discard)

redis 编译性错误保证原子性,运行时错误不保证原子性

watch money 监视对象,如果在事务执行之前,money发生变化,那么事务将会执行失败,可以实现乐观锁,事务执行失败后,可以unwatch取消监视,然后再重新监视

使用原生的Jedis对象,集成到java中

配置文件

配置文件unit单位对大小写不敏感

include /path/to/local.conf 包含,把外部文件包含进来

bind 127.0.0.1 绑定ip

protected-mode yes 保护模式

port 6379 端口

内存达到上限后的处理策略

1.volatile-lru 只对设置了过期时间的key进行lru(默认值)

2.allkeys-lru 删除lru算法的key

3.volatile-random 随机删除即将过期key

4.allkeys-random 随机删除

5.volatile-ttl 删除即将过期的

6.noeviction 永不过期,返回错误

appendonly no 默认是不开启aof模式的,默认是使用rdb方式持久化,在大部分的情况下,rdb完全够用。

持久化

rdb保存的文件名默认是dump.rdb

原理:redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何io操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那rdb方式要比aof方式更加高效。rdb的缺点是最后一次持久化后的数据可能丢失。

rdb保存文件生成的触发机制:

1.save的规则满足的情况下

2.执行flushall命令

3.退出redis

config get dir 命令查询rdb文件的存放位置

rdb文件优点:

1.适合大规模的数据恢复

2.对数据的完整性要求不高

缺点:

1.需要一定的时间间隔进程操作,如果redis意外宕机,这个最后一次修改数据就没有了

2.fork进程的时候,会占用一定的内存空间。

aof文件

将我们的所有命令都记录下来,恢复的时候就把这个文件全部再执行一遍。

以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

默认不开启,我们需要手动进行配置,我们只需要将appendonly 改为yes 就开启了aof

重启redis,就生效

如果这个aof文件损坏,redis就无法启动,我们需要修复这个aof文件,使用redis-check-aof --fix

如果文件正常,就可以启动redis,恢复正常数据。

优点:

1.每一次修改都同步,文件的完整性会更好

2.每秒同步一次,可能会丢失一秒的数据

3.从不同步,效率是最高的,根据操作系统的规则同步

缺点:

1.相对于数据文件而言,aof远远大于rdb(12kb),修复的速度也比rdb慢

2.aof运行效率也要比rdb慢,所以我们redis默认的配置就是rdb持久化

优先加载aof文件

发布订阅

subscribe kuangshenshuo 订阅端自动接受消息

publish kuangshenshuo “hello” 发布端发布消息

主从赋值

info replicatIOn 查看库的信息

slaveof 127.0.0.1 6379 从库配置主库

从库只能读不能写,主库可读可写

从机启动成功连接到master后会发送一个sync命令,master接到命令后,启动后台的存盘进程,同时手机所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到从机,并完成一次完全同步。

全量复制:从机服务在接收到数据库文件后,将其存盘并加载到内存中

增量复制:master继续将新的所有收集到的修改命令依次传给从机,完成同步。

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

哨兵模式

假设主服务器宕机,哨兵1检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover【故障转移】操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。如果主机重新工作,则会被当做从机。

1.配置哨兵配置文件sentinel.conf

sentinel monitor myredis 127.0.0.1 6379 1 1是说明有一个哨兵认为主机不可用,就可以开始投票。

缓存穿透

设置null值

缓存击穿(key失效后大并发会导致数据库压力过大)

设置热点数据不过期

缓存雪崩(大量key同时失效)

设置不同的过期时间

springboot 集成redis 两个对象 jedis,lettuce

默认使用lettuce

lettuce与jedis两者有什么区别呢?

  1. lettuce:底层是用Netty实现,线程安全,默认只有一个实例。
  2. jedis:可直连redis服务端,配合连接池使用,可增加物理连接。

Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对

TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞

的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页