Redis(基础篇)

^_^ 基本介绍

  • redis是一种内存数据库,所以拥有极高的存储和访问速度。
  • 正因为极高的读取速度,所以redis常被用来作为数据缓存服务器。
  • 虽然redis是内存数据库,但是支持 数据持久化 的(即redis会自动将数据写入磁盘)——这也是redis流行的一个重要原因;
  • redis是NoSQL数据库,不是传统的关系型数据库,存储的是键值对数据;
  • redis是完全开源免费的,在2010年以后redis开始大面积流行。

Redis为什么快呢?

Redis的速度⾮常的快,单机的Redis就可以⽀撑每秒十几万的并发,相对于MySQL来说,性能是MySQL的⼏⼗倍。
速度快的原因主要有⼏点:

  1. 完全基于内存操作
  2. 使⽤单线程,避免了线程切换和竞态产生的消耗
  3. 基于⾮阻塞的IO多路复⽤机制
  4. C语⾔实现,优化过的数据结构,基于⼏种基础的数据结构,redis做了⼤量的优化,性能极⾼

安装:

  • window: Redis-x64-3.2.100.zip
    下载后直接解压就有 服务端 和 客户端,直接双击运行。
  • Ubuntu: apt install redis (或 apt install redis-server)

中文版命令参考手册

支持存储的数据类型:

  • 字符串(单个value最大支持512M);
  • 哈希hash(存储对象);
  • 列表list ;
  • 集合set ;
  • 有序集合zset;



^_^ redis客户端的管理命令

# 如果一台服务器有多个redis服务,例如6379端口上一台,6378上也有一台
redis-cli   #进入客户端,链接的redis 默认是 6379 的reids服务
redis-cli -p 6378 # 此时进入客户端,连接 的是 6378 的reids服务。 
redis-cli -h 127.0.0.1 -p 6379 -a 123456 # 使用密码访问远程redis:


auth 密码   #验证密码
dbsize    #查看当前数据库的键值对数量

flushdb   #清空当前数据库的数据
fushall   #清空所有数据库的数据  

monitor   #监视 后来 连接到服务 的 客户端 的 一举一动
client list #查看所有连接到 服务端 的客户端

## 键值对相关操作
del key  #删除键值对

keys *    #查看当前仓库中 所有的 键值对
keys a*   #显示所有以a开头的键

randomkey #返回一个随机的key

exists key    # 判断key是否存在

type key     #查看键值对的类型:string、hash、list...

ttl key     #查看键值的过期时间
persist key #取消键的过期时间

rename oldKey newKey  #重命名键
renamenx oldKey newKey #当newKey不存在时,才会才重命名

select 5    #切换数据库,redis默认有16个数据库,初始默认使用0号数据库
move key 3  #将key移动到 3号数据库



^_^ 基本数据结构

在这里插入图片描述

字符串

字符串最基础的数据结构。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字 (整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

字符串主要有以下几个典型使用场景:

  • 缓存功能
  • 计数
  • 共享Session
  • 限速
set key value   #设置键值对 
setex key 20 value   #设置20秒后过期de键值
mset key1 value1 key2 value2    #一次性存储多个键值
setnx key value   #当key不存在时,才会设置成功

get key   #获取键值对,不存在则返回null
mget key1 key2    #一次性拿取多个键值
getset name newValue   #为name设置新值,返回之前的旧值

incr/decr key   #key(其值是integer类型) 的 加加/减减
incrby/decrby key 20 #key 加/减 20

append key aaa #key的值 字符拼接 上 字符串:“aaa”
getrange name 0 2   #从name的值上截取子串
strlen key    # 获取字符长度
bitcount key    # 获取值占用的比特数

哈希hash

哈希类型是指键值本身又是一个键值对结构。

哈希主要有以下典型应用场景:

  • 缓存用户信息
  • 缓存对象
hset obj key value key2 value2 # obj 可以后期再添加,更改 键值对
hset obj key newValue
hmset obj key newValue key2 newVakuew

hget obj key 
hmget obj key key2
hgetall obj # 获取全部键和值
hkeys obj   #获取全部的键
hvals obj   #获取全部的值

hdel obj key key2   #删除 key key2 属性

hlen obj    #键值对的个数
hstrlen obj key #key的值的 字符长度
hexists obj key  #判断obj中是否有key字段

列表(数组)list

列表(list)类型是用来存储多个有序的字符串。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色

列表主要有以下几种使用场景:

  • 消息队列
  • 文章列表
rpush arr aaa bbb ccc   #创建 arr数组,其元素为:aaa bbb ccc

lpush arr ddd   #此时arr=[ddd, aaa,bbb,ccc] 索引:0--3
rpush arr eee   #此时arr=[eee, aaa,bbb,ccc,eee] 索引:0--4

linsert arr after aaa fff # [eee,aaa, fff, bbb,ccc,eee]
lset arr 0 abc  #[abc ,aaa,fff,bbb,ccc,eee]

lpop arr    #[aaa,fff,bbb,ccc,eee]
rpop arr    #[aaa,fff,bbb,ccc]


llen arr  #数组的长度
lrange arr 0 -1   #从头到尾 遍历一遍

# 删除 arr数组 
# 如果arr数组中所有的元素都被删除,arr数组也就不存在了。
del arr

集合 set

集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的。

集合主要有如下使用场景:

  • 标签(tag)
  • 共同关注
  • 经常用于求交集、并集、差集等。
sadd mset aaa 222 bbb   # 向集合mset中添加元素1,2,3,4
smembers mset   #查看集合mset中的元素
scard mset    #查询集合元素个数
sinter mset mset2   #求mset和mset2的交集
sdiff mset mset2    #求mset相比mset2的差集(mset有而mset2无的部分)
sunion mset mset2   #求mset和mset2的并集
sismember mset vvv    #判断 vvv 是否是mset中的元素

有序集合 zset

有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个权重(score)作为排序的依据。

有序集合主要应用场景:

  • 用户点赞统计
  • 用户排序
#创建有序组合,添加多个权重:10 7 4 1 和元素: tom cat miao 猫
zadd wtt 10 tom 7 cat 4 miao 1 猫 

zrange wtt 0 -1  #按权重升序排列 遍历有序数组
zcard wtt   # 元素个数
zcount wtt 6 10   #权重6-10之间元素的个数
zscore wtt cat   #返回 cat 的权重值

^_^ 持久化

^_^ 机制概念

1、I/O多路复用

引用知乎上一个高赞的回答来解释什么是I/O多路复用。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:

  • 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡住,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。

  • 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。这种类似于为每一个用户创建一个进程或者- 线程处理连接。

  • 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。

第一种就是 阻塞IO模型,第三种就是 I/O复用模型
Linux系统有三种方式实现IO多路复用:select、poll和epoll。

2、

^_^ 有趣疑问

Redis6.0使用多线程是怎么回事?

Redis不是说用单线程的吗?怎么6.0成了多线程的?
Redis6.0的多线程是用多线程来处理数据的读写和协议解析,但是Redis执行命令还是单线程的。
这样做的⽬的是因为Redis的性能瓶颈在于⽹络IO(IO操作) ⽽⾮ CPU(执行命令),使⽤多线程能提升IO读写的效率,从⽽整体提⾼Redis的性能。

^_^ redis配置管理

配置文件: /etc/redis/redis.conf

常用配置

# 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小写不敏感

# 1k => 1000 bytes

# 1kb => 1024 bytes

# 1m => 1000000 bytes

# 1mb => 1024*1024 bytes

# 1g => 1000000000 bytes

# 1gb => 1024*1024*1024 bytes

#

# units are case insensitive so 1GB 1Gb 1gB are all the same.



################################## INCLUDES(导入) ###################################

# 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
# 类似jsp中的include,多实例的情况可以把公用的配置文件提取出来
# 由于 redis 总是以 后面的 配置指令值 为准,所以最好是把 include 放在这个文件的最前面,

# include /path/to/local.conf
# include /path/to/other.conf



################################## MODULES #####################################



# Load modules at startup. If the server is not able to load modules

# it will abort. It is possible to use multiple loadmodule directives.

#

# loadmodule /path/to/my_module.so

# loadmodule /path/to/other_module.so



################################## NETWORK(网络) #####################################

# 绑定的主机地址,默认情况bind=127.0.0.1只能接受本机的访问请求
# 不写的情况下,无限制接受任何ip地址的访问
# 生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉

bind 127.0.0.1 ::1


# 如果开启了protected-mode,那么在没有设定bind ip且 没有设密码的情况下,Redis只允许接受 本机的响应
# 将本机访问保护模式设置no,redis在服务器上的时候就需要设置为no

protected-mode yes


# 指定 Redis 监听端口,默认端口为 6379,作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口,
# 因为 6379 在手机按键上 MERZ 对应的号码,而 MERZ 取自意大利歌女 Alessia Merz 的名字

port 6379


# 设置tcp的backlog,backlog其实是一个连接队列,===> backlog队列总和数 = 未完成三次握手队列数 + 已经完成三次握手队列数 <===
# 在 高并发环境下 需要一个  高backlog值  来避免 慢客户端连接问题。
# 注意Linux内核 会将这个值 减小到/proc/sys/net/core/somaxconn的值(128),
# 所以需要确认增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果

tcp-backlog 511


# 当客户端 闲置多长秒 后关闭连接,如果指定为 0 ,表示关闭该功能

timeout 0


# 对访问 客户端  的一种 ===> 心跳检测 <===
# 每 n秒 检测一次,单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60

tcp-keepalive 300


################################# GENERAL(通用) #####################################

# Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no )
daemonize yes  


# 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
pidfile /var/run/redis/redis-server.pid



# 可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的。
# supervision tree. Options:

#   supervised no      - no supervision interaction

#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode

#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET

#   supervised auto    - detect upstart or systemd method based on

#                        UPSTART_JOB or NOTIFY_SOCKET environment variables

supervised no


# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
# 四个级别根据 使用阶段 来选择,生产环境 选择notice 或者 warning

loglevel notice


# 日志文件名称

logfile /var/log/redis/redis-server.log


# 设定 库的数量 默认16,默认数据库为0,可以使用SELECT <dbid>命令在 连接上指定数据库id

databases 16


# 是否总是显示logo

always-show-logo yes


################################ SNAPSHOTTING(快照)  ################################

# 指定在多长时间内,有多少次更新操作,就将 数据同步 到 数据文件(硬盘)中
# 可以多个条件配合,Redis 默认配置文件中提供了三个条件:
# save 900 1  #  900 秒(15 分钟)内有 1 个更改
# save 300 10  #  300 秒(5 分钟)内有 10 个更改
# save 60 10000  # 60 秒内有 10000 个更改。


save 900 1

save 300 10

save 60 10000


# 持久化出现错误后,是否 停止写入

stop-writes-on-bgsave-error yes


# 数据压缩
# 指定存储至本地数据库时是否压缩数据,默认为 yes,
# Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大

rdbcompression yes


# 是否CRC64校验rdb文件,会有一定的性能损失(大概10%)

rdbchecksum yes


# 指定 本地数据库 的 文件名,默认值为 dump.rdb

dbfilename dump.rdb


# 指定 本地数据库 文件的 存放目录

dir /var/lib/redis



################################## SECURITY(安全) ###################################

# 在命令中设置密码,只是临时的。重启redis服务器,密码 就还原了。
# 永久设置,需要再配置文件中进行设置 密码

requirepass 123456


################################### CLIENTS(客户端) ####################################

# 设置redis同时可以与 多少个客户端 进行连接。默认情况下为10000个客户端。
# 如果达到了此限制,redis则会  拒绝  新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

maxclients 10000


############################## MEMORY MANAGEMENT(内存管理) ################################

# 建议必须设置,否则,将内存占满,造成服务器宕机
# 设置redis可以使用的内存量。一旦到达内存使用上限,redis将会 试图移除 内部数据,移除规则 可以通过maxmemory-policy来指定。
# 如果redis无法根据 移除规则 来移除内存中的数据,或者设置了“不允许移除”,
# 那么redis则会 针对 那些需要 ==申请内存的指令== 返回 错误信息 ==》比如SET、LPUSH等。但是对于 ==无内存申请的指令==,仍然会正常响应,比如GET等。

# 如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,
# 需要在系统中 留出一些内存空间 给 同步队列 缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

maxmemory <bytes>


# 试图移除 内部数据的 移除规则:
# volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
# allkeys-lru:在所有集合key中,使用LRU算法移除key
# volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
# allkeys-random:在所有集合key中,移除随机的key
# volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
# noeviction:不进行移除。针对写操作,只是返回错误信息

maxmemory-policy noeviction



############################## APPEND ONLY MODE(内存==>硬盘) ###############################

# 指定 是否在 每次更新操作 后 进行日志记录,默认为 no
# Redis 在默认情况下是 异步的 把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
# 因为 redis 本身同步数据文件 是按 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。

appendonly no


# 指定 更新 日志文件名,默认为 appendonly.aof

appendfilename "appendonly.aof"


# 指定更新日志条件,共有 3 个可选值:
#   no:表示等操作系统进行数据缓存同步到磁盘(快)
#   always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全)
#   everysec:表示每秒同步一次(折中,默认值)

appendfsync everysec
  • 设置密码: requirepass 123456
    进入客户端后:auth 123456 验证密码之后才能和 服务端 建立连接。

  • 允许远程连接

    1. 注释掉本机绑定: # bind 127.0.0.1 (或者: bind 0.0.0.0)
    2. 取消保护模式: 修改protected-mode yes为protected-mode no
    3. 设置防火墙,开放端口
  • 最大运行内存的分配: maxmemory 1073741824 #前为1G,单位字节

注意: 修改完配置文件,重新启动一下程序:systemctl restart redis-server

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值