Redis入门

一、Linux下安装

1.基本环境安装

  yum install gcc-c++

查看是否安装成功

gcc -v

执行make命令,配置所需要的文件

make

在这里插入图片描述
再次执行一次make
在这里插入图片描述

然后执行 make install

make install

在这里插入图片描述
进入 /usr/local/redis 目录下
在这里插入图片描述
创建一个文件夹,文件夹里面 redis.config 配置文件是以后启动用到的配置文件。
在这里插入图片描述
2.启动
默认不是后台启动,需要修改配置文件。
在这里插入图片描述
启动

redis-server myredisconfig/redis.conf

在这里插入图片描述
判断是否启动

redis-cli -p 6379

在这里插入图片描述
另一窗口中查看

ps -ef | grep redis

在这里插入图片描述
3.关闭redis
执行命令 shutdown
在这里插入图片描述

二、redis性能测试工具

官方测试工具: redis-benchmark
redis 性能测试工具可选参数如下所示:
在这里插入图片描述
测试demo

#  测试:100个并发请求   100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

三、redis基本知识

1.库
有16个数据库,默认使用第0个数据库
在这里插入图片描述
可以用select进行切换数据库
在这里插入图片描述
清除当前数据库

> flushdb

清除全部数据库的内容

> flushall

2.单线程

  • redis是单线程
  • redis基于内存操作,CPU不是redis性能瓶颈,redis的性能瓶颈取决于机器的内存和网络带宽。而这可以使用单线程来实现,于是redis就使用了单线程。
  • redis是C语言写的,官方提供数据 10万+ 的QPS,完全不比同样是使用 key-value 的Memecache差。

redis为什么单线程还这么快?

  1. 误区一:高性能的服务器一定是多线程的?
  2. 误区二:多线程(CPU会产生上下文切换!)一定比单线程效率高?
  3. CPU > 内存 > 硬盘的速度
  4. 核心:redis是将所有数据全部存放在内存中,所以使用单线程去操作效率就是最高的。
  5. 多线程在操作时,CPU会进行上下文的切换,这是非常耗时的操作,对于内存来说,没有上下文切换,多次读写都是在一个CPU上的,所以效率就是最高的。

四、redis数据类型

> keys *    # 查看所有的key
> set name kaixing     # set key
> exists name   # 判断key是否存在
> move name 1  # 移除当前的key
> expire key 10   # 设置过期时间
> ttl key    # 查看当前key还剩多少过期时间
> type name     # 查看当前key是什么类型

一、常见5个数据类型

1. String 类型
使用场景:value 可以是字符串,也可以是数字

  1. 计数器
  2. 统计多单位的数量
  3. 对象缓存存储
  • append 追加
> append key1 "hello"
(integer) 13
> get key1
"kaixinghello"
  • strlen 获取字符串长度
> strlen key1
(integer) 13
  • incr 加、decr 减
> set nums 0    # 初始化 0
> get nums
"0"
> incr nums   # 自增 1
(integer) 1
> decr nums   # 自减 1
(integer) 0
> incrby nums 10    # 设置步长,指定增量 10
(integer) 10
> decrby nums 5    # 设置步长,指定减量 5
(integer) 5
  • getrange 字符串范围
> set word "hello,orange"
OK
> get word
"hello,orange"
> getrange word 0 3
"hell"
> getrange word 0 -1
"hello,orange"
  • setrange 替换
> set word "hello,orange"
OK
> get word
"hello,orange"
> setrange word 6 kaixing   # 6 位置开始字符串
(integer) 14
"hello,kaixing"
  • setex (set with expire)设置过期时间、setnx (set if not exist)不存在再设置
  • mset mget 批量设置, msetnx (原子性,都成功或都失败)
  • 对象
set user:1 {name:orange,age:10}  # 设置一个 user:1 对象,值为 json 字符来保存一个对象

# 这里的 key 是一个巧妙的设计    user:{id}:{field}    redis中可以这样设计
> mset user:1:name orange user:1:age 10
OK
> mget user:1:name user:1:age
1) "orange"
2) "10"
  • getset
> getset db orange
(nil)
> get db
"orange"
> getset db kaixing
"orange"
> get db
"kaixing"

2. List 列表类型

  • redis 中可以把List列表当做栈、队列、阻塞队列。
  • lpush rpush
  • lpop rpop
  • lrange
  • lindex
  • lrem 指定删除元素
    lrem list 2 apple 删除list中2个apple元素
  • ltrim 截取
    ltrim list 1 2 通过下标截取指定长度
  • rpoplpush 移除列表最后一个元素,并移动到另一个列表中
    rpoplpush mylist myotherlist
  • lset 将列表中指定下标的值替换为另一个值,更新操作
    lset list 0 orange 更新数据,如果不存在list则会报错
  • linsert 插入数据
    before 之前插入 after 之后插入
  • list实际上是一个链表, before node after ,left和right都可以插入值
  • 如果key不存在,创建新的链表,如果key存在,新增内容。
  • 如果移除了所有值,就是空链表,也就代表不存在。
  • 在两边插入或者改动值,效率最高,中间元素相对效率低一些
  • 消息排队,消息队列(Lpush Rpop), 栈(Lpush Lpop)

3. Set 集合类型

  • Set中的值无序且不重复
  • sadd
  • smenbers set中具体元素
  • scard set中元素内容个数
  • srem 移除指定元素
  • srangemenber 随机抽选出一个或指定个数元素
  • spop 随机删除元素
  • smove 将指定的值移动到另一个集合中
  • sdiff key1 key2 差集
  • sinter key1 key2 交集
  • sunion key1 key2 并集

4. Hash 哈希类型

  • Map集合,key-value, 本质和String类型没有太大区别,只是值变成两个值组成
  • hset hget
  • hmset hmget 批量
  • hgetall 获取所有数据,展示key和value
  • hdel
  • hlen
  • hkeys hvals 只获取所有的field或value
  • hincrby hdecrby 给指定增量
  • hsetnx 如果不存在则可以设置
  • hash更适合对象存储,String更适合字符串存储

5. Zset 有序集合类型

  • Sorted Sets 是Set基础上增加了一个值
  • zadd
  • zrangebyscore key -inf +inf
    zrangebyscore key -inf +inf with scores
    zrangebyscore key -inf +5000 with scores
  • zrevrange key 0 -1 从大到小排序
  • zrange key 0 -1
  • zrem
  • zcard 获取集合中个数
  • zcount

二、特殊三种数据类型

1. geospatial 地理位置
http://www.jsons.cn/lngcodeinfo/E5290845730F3718
getadd
添加地理位置,两极无法直接添加
key value(经度,纬度,名称)

> geoadd china:city 116.40 39.90 beijin
(integer) 1

geopos
获取指定城市经度纬度

geopos china:city beijing

geodist
获取直线距离

> geodist china:city beijing shanghai km
"1067.3788"

georadius
定位附近的城市,以给定的位置为中心,通过半径查询

georadius china:city 110 30 1000 km
# 可加参数 withdist  显示到中间距离的位置
withcoord  显示他人的定位信息
withdist withcoord count 1   筛选指定的结果

georediusbymember
找出位于指定元素周围的其它元素

georediusbymember china:city shanghai 1000 km

geohash
返回一个或多个位置元素的geohash表示
返回11个字符的geohash字符串
将二维的经纬度转换成一维的字符串

> geohash china:city beijing shanghai

原理就是Zset

2. Hyperloglog 基数统计
基数统计的算法
网页UV(一个人访问一个网站多次,算作一次)
传统方式:set保存用户id,统计set中的元素数量。
Hyperloglog:占用内存固定,2^64不同的元素的技术,只需12kb内存。从内存角度比较Hyperloglog首选。
前提:允许容错,否则使用set或自己的数据类型。

PFadd mykey1 a b c    # 创建第一组元素
PFcount mykey1   # 统计mykey1元素的基数数量
PFadd mykey2  b c d
PFMERGE mykey mykey1 mykey2    # 合并两组到 mykey  ,并集

3.Bitmap 位图场景
按位存储
数据结构,操作二进制位来记录,只有0和1。

setbit sign 0 1
setbit sign 1.1
setbit sign 2 0
setbit sign 3 1
setbit sign 4 1
setbit sign 5 0
setbit sign 6 0    # 设置本周打卡

getbit sign 0      # 查看某天是否打卡
bitcount sign     # 统计这周打卡记录

五、redis事务

  • 是一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中按顺序执行。
  • 一次性,顺序性,排它性
  • redis事务没有隔离级别的概念,所有在事务中的命令只有发起执行命令的时候才会执行。
  • redis单条命令保持原子性,事务不保持原子性。
  • redis事务处理:开启事务 Multi 》命令入队 》执行事务 exec
  • 放弃事务 discard , 队列中所有事务都不会执行。
> multi
OK
> set k1 v1
QUEUED
> set k2 v2
QUEUED
> exec

六、redis实现乐观锁

悲观锁
无论什么时候都加锁
乐观锁

  • 无论什么时候都不加锁。更新数据时去判断一下在此期间是否有人修改过这个数据。
  • 获取 version , 更新时比较 version
    watch 监视
    watch本身就是乐观锁

七、Jedis操作redis

  • Jedis是Redis官方推荐的java连接开发工具,使用Java操作redis中间件。

八、SpringBoot集成Redis

九、Redis配置文件

十、RDB持久化

十一、AOF持久化

十二、Redis订阅发布

订阅端

> subscribe orange        # 订阅一个频道 orange
......
# 等待读取推送的信息
--- 消息
--- 频道
--- 消息具体内容

发送端

> publish orange "hello,orange"         # 发布一条消息到频道
(integer) 1

使用场景:
1、实时消息系统
2、实时聊天(把频道当做聊天室,将信息回显给所有人即可)
3、订阅,关注系统
4、复杂的场景就会使用消息中间件MQ

十三、Redis集群

环境配置
只配置从库,不用配置主库

> info replication       # 查看当前库信息
...

复制3个配置文件,然后修改对应的信息
1、端口号
2、进程pid 名字
3、日志文件名字
4、dump.rdb 名字
一主二从
默认情况下,每台redis服务器都是主节点,一般情况下只要配置从节点即可。

127.0.0.1 6380> slaveof 127.0.0.1 6379
OK

真正的主从配置应该在配置文件中配置,这样才是永久的,这里使用命令配置只是暂时的。
注意
1、主机可以写,从机不可写,只能读。
2、主机中所有信息都会自动被从机保存。
3、主机断开连接,从机依旧是连接主机的,但是没有了写的操作,这个时候主机回来了,从机依旧可以获取到主机写的信息。
4、如果主机断开,可以使用 slaveof no one 变成主机,其它的节点就可以手动连接到这个主节点(手动),如果这个时候原来的主机回来了,那就重新连接配置。

十四、主从复制

主从复制作用
1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以有从节点提供服务,实现快速的故障恢复,实际上是一种服务的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时用连接主节点,读Redis数据时用连接从节点),分担服务器负载,尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用(集群)基石:主从复制是哨兵和集群能够实施的基础,因此主从复制是Redis高可用的基础。

十五、哨兵模式

自动选取主机的模式
1、sentinel.conf 配置文件中进行哨兵的配置

#  sentinel monitor 被监控的主机名称 host port 主机挂了从机投票
sentinel monitor myredis 127.0.0.1 6379 1

2、启动

bin > redis-sentinel myConfig/sentinel.conf

如果主节点断开了,就会在从机中选取一个作为主机,在日志中可以看到哪个从机变成主机了。
优点
1、哨兵模式基于主从复制模式,具备所有的主从配置优点。
2、主从可以切换,故障可以转移,系统的可用性会更好。
3、哨兵模式就是主从模式的升级,手动到自动,更加健壮。
缺点
1、Redis不好在线扩容,集群容量一旦到达上限,在线扩容就会变得十分麻烦。
2、实现哨兵模式的配置其实很麻烦,里面有很多选择。

十六、缓存穿透和雪崩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值