一站式学习Redis 从入门到高可用分布式实践笔记(一):Redis初识&API的理解和使用

Redis初识&API的理解和使用

在这里插入图片描述

1. 初识Redis

1.1 开始

开源
Key-Value存储服务器
在这里插入图片描述
多种数据结构
速度快,功能丰富

1.2 特性

速度快

  1. 数据存在内存(主要原因)
  2. 使用c语言
  3. 线程模型为 单线程
    在这里插入图片描述

持久化:数据将异步的保存在磁盘当中

数据结构:还有其它的几种衍生数据结构如下:
在这里插入图片描述

多语言客户端

功能丰富:
1. 发布订阅
2. lua脚本
3. 事务
4. pipeline

简单

  1. 单机版核心代码只有2.6w行
  2. 不依赖外部库
  3. . 单线程模型

主从复制

高可用分布式

1.3 典型使用场景

  1. 缓存系统
  2. 计数器
  3. 消息队列系统
  4. 排行榜
  5. 社交系统
  6. 实时系统

1.4 三种启动方式

简单启动:redis-server
动态参数:redis-server --port 6380
配置启动:redis-server configPath

启动后可以用客户端连接:redis-cli -h ip -p port
在这里插入图片描述

1.5 常用配置

daemonize : 是否是守护进程(nolyes)
port : Redis对外端口号
logfile: Redis系统日志
dir : Redis工作目录

2. API的理解和使用

2.1 通用命令

keys * #遍历所有key
del key [key…] #删除指定的key-value
dbsizee 算出key的总数
expire key seconds #key在sc秒后过期
ttl key #查看key剩余的过期时间(-1 代表没有过期时间 -2代表已过期)
persist key #去掉key的过期时间
exists key #检查一个key是否存在
type key #返回key的类型,结果为string hash list set zset none(key不存在)
在这里插入图片描述

2.2 数据结构和内部编码

在这里插入图片描述

2.3 redis的单线程

在这里插入图片描述

在这里插入图片描述单线程为什么还这么快?

  1. 纯内存
  2. 非阻塞IO
  3. 避免线程切换和竞态消耗

其它注意点

  1. 一次只运行一条命令
  2. 拒绝长(慢)命令
    keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
  3. 其实不是全是单线程,如下面的命令
    fysnc file descriptor
    close file descriptor

2.4 字符串

特点

key都为字符串 value可为 字符串(json) 整数 二进制
在这里插入图片描述

API
get key  
#获取key对应的value
set key value
#设置key-value
del key 
#删除key-value
incr key
#key自增1,如果key不存在,自增后get(key)=1
decr key o(1)
#key自减1,如果key不存在,自减后get(key)=-1
incrby key k
#Key自增k,如果key不存在自增后get(key)=k 
decr key k
#Key自减k,如果key不存在,自减后get(key)=-k 
set key value
#不管key是否存在,都设置
setnx key value
#key不存在,才设置
set key value xx
#key存在,才设置

注:以上命令 时间复杂度均为 o(1)

mget keyl key2 key3...
#批量获取key,原子操作
mset key1 valuel key2 value2 key3 value3
#批量设置key-value

注:以上命令 时间复杂度均为 o(n)

getset key newvalue
#set key newvalue并返回旧的value
append key value
#将value追加到旧的value(相当于字符串拼接)
strlen key
#返回字符串的长度(注意中文)
incrbyfloat key 3.5
#增加key对应的值3.5
getrange key start end
#获取字符串指定下标所有的值
setrange key index value
#设置指定下标所有对应的值

注:以上命令 时间复杂度均为 o(1)

实战

例一:实现如下功能:
缓存视频的基本信息(数据源在MySQL中)
在这里插入图片描述
伪代码如下:
在这里插入图片描述
例二:分布式id生成器
在这里插入图片描述

2.5 hash

特点

key还是String类型 ,值则分成 field和value,可以添加field来对属性进行扩充
redis本身就是一个map结构的,所以可以把这种数据结构理解成 “mapmap”,其中 field就像key一样不能相同 。
在这里插入图片描述

API

所有命令都是以h开头

hget key field
#获取hash key对应的field的value
hset key field value
#设置hash key对应field的value
hdel key field
#删除hash key对应field的value
hexists key field
#判断hash key是否有field
hlen key
#获取hash key field的数量
hsetnx key field value
#设置hash key对应field的value(如field已经存在,则失败)
hincrby key field intCounter
#hash key对应的field的value自增intCounter
hincrbyfloat key field floatCounter
#hincrby浮点数版

注:以上命令 时间复杂度均为 o(1)

hmget key field1 field2....fieldN
#批量获取hash key的一批field对应的值
hmset key fieldI valuel field2 value2..fieldN valueN
#批量设置hash key的一批field value
hgetall key
#返回hash key对应所有的field和value
hvals key
#返回hash key对应所有field的value
hkeys key
#返回hash key对应所有field

注:以上命令 时间复杂度均为 o(n)

实战

实现如下功能:
记录网站每个用户个人主页的访问量?
思路:hincrby user:1:info pageview count

实现如下功能:
缓存视频的基本信息(数据源在mysql中)伪代码
在这里插入图片描述

2.6 list

列表结构
在这里插入图片描述
同时还可以删除指定索引元素,获取子列表,获取指定索引下的元素
在这里插入图片描述

特点

有序
可以重复
左右两边插入弹出

API

增加

rpush key valuel value2...valueN
#从列表右端插入值(1-N个)
lpush key valuel value2...valueN
#从列表左端插入值(1-N个)

插入

linsert key beforelafter value newValue
#在list指定的值前|后插入newValue

删除

lpop key
#从列表左侧弹出一个item
rpop key
#从列表右侧弹出一个item
lrem key count value
#根据count值,从列表中删除所有value相等的项
(1)count>0,从左到右,删除最多count个value相等的项
(2)count<0,从右到左,删除最多Math.abs(count)个value相等的项
(3)count=0,删除所有value相等的项
ltrim key start end
#按照索引范围修剪列表

查询

lrange key start end(包含end)
#获取列表指定索引范围所有item
lindex key index
#获取列表指定索引的item

获取列表长度

llen key
#获取列表长度

lset key index newValue
#设置列表指定索引值为newValue

演示
在这里插入图片描述

实战

实战-TimeLine(微博关注的人更新)
在这里插入图片描述

查漏补缺
api blpop key timeout
#Ipop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
brpop key timeout
#rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞

2.7 set

特点

集合结构
在这里插入图片描述
取出两个用户的共同,不同,和并集
在这里插入图片描述
特点如下:
无序
无重复
集合间操作

集合间API和实战

添加和删除

sadd key element
#向集合key添加element(如果element已经存在,添加失败)
srem key element
#将集合key中的element移除掉
scard user:1:follow=4#计算集合大小
sismember user:1:follow it=1(存在)#判断it是否在集合中
srandmember user:1:follow count=his#从集合中随机挑count个元素
spop user:1:follow=sports#从集合中随机弹出一个元素
smembers user:1:follow =music his sports it#获取集合所有元素

注:spop从集合弹出
srandmember不会破坏集合

演示
在这里插入图片描述
在这里插入图片描述
实战-标签(tag)
1.给用户添加标签

sadd user:1:tags tagl tag2tag5
sadd user:2:tags tag2 tag3 tag5
sadd user:k:tags tag1 tag2 tag4

2.给标签添加用户

sadd tagl:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
sadd tagk:users user:1 user:2

集合间API
在这里插入图片描述

sdiff user:1:follow user:2:follow=music his#差集
sinter user:1:follow user:2:follow =it sports#交集
sunion user:1:follow user:2:follow =it music his sports news ent#并集
sdifflsinterlsuion+store destkey..#将差集、交集、并集结果保存在destkey中

2.8 ZSET

特点

有序集合结构(右边是集合 左边是分值 可根据分值进行排序)
在这里插入图片描述
集合Vs有序集合
在这里插入图片描述

重要API
zadd key score element(可以是多对,复杂度为logN)
#添加score和element
zrem key element(可以是多个)
#删除元素
zscore key element
#返回元素的分数
zincrby key increScore element
#增加或减少元素的分数
zcard key
#返回元素的总个数
zrange key start end[WITHSCORES]
#返回指定索引范围内的升序元素[分值] o(log(n)+m)
zrangebyscore key minScore maxScore  [WITHSCORES] 
#返回指定分数范围内的升序元素[分值]o(log(n)+m)
zcount key minScore maxScore
# 返回有序集合内在指定分数范围内的个数 o(log(n)+m)
zremrangebyrank key start end
# 删除指定排名内的升序元素 o(log(n)+m)

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值