__Redis总结

2021/5/7 19:31:08

本文主要是介绍__Redis总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

阳哥Redis
16年录的,有些东西可能有些过时
笔记从p5开始做

K-V键值
文档数据库 - MongoDB - 分布式文件存储的数据库,的代表
列存储数据库 - HBase
图关系数据库 - Neo4J、InFoGrid - 社交关系,广告推荐

CA 单点集群 传统数据库
CP 性能不是很高 Redis
AP 对一致性要求不高 大多数网站架构选择

BASE
Basically Available 基本可用
Soft state 软状态
Eventually consistent 最终一致

通过放弃系统某一时刻的一致性来换取系统整体伸缩性和性能的改观

Redis kv cache persistence
REmote DIctionary Server
完全开源,高性能kv分布式内存数据库
特点:

  1. 支持数据持久化
  2. 除了kv,还支持list、set、zset、hash
  3. 支持数据备份
    能干啥:
  4. 内存存储和持久化,支持异步将内存中的数据写到硬盘上,同时不影响服务
  5. 去最新的n哥数据操作
  6. 模拟类似于HttpSession这种需要设定过期时间的功能
  7. 发布、订阅消息
  8. 定时器、计数器

怎么玩

  1. 数据类型、基本操作、设置
  2. 持久化和复制,RDB / AOF
  3. 事物的控制
  4. 复制

README

本笔记基于b站尚硅谷的视频所做

互联网发展

解决功能性问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN

解决拓展性问题:Struts、Spring、SpringMvc、Hibernate、Mybatis

解决性能问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch

单服务器->单数据库

->

nginx -> 多台服务器 ->数据库

问题:用户信息存在session对象里,多台服务器里的session对象怎么信息同步?

  1. 存到客户端里,有安全问题
  2. 互相复制,浪费性能
  3. 存到NoSQL数据库中

问题:IO压力

  1. 分库分表读写逻辑
  2. 存到缓存数据库中

SQL与NoSQL

传统ACID

A 原子性
C 一致性
I 独立性
D 持久性

NOSQL的CAP - 只能3选2

C 强一致性
A 可用性
P 分区容忍性

CA 单点集群 传统数据库
CP 性能不是很高 Redis
AP 对一致性要求不高 大多数网站架构选择

NoSQL适用场景

  • 高并发的读写

  • 海量数据读写

  • 对数据高可拓展性

  • 最新N个数据(通过list按自然时间排序的数据

  • 排行榜Top N(利用zset

  • 时效性的数据(例如验证码

  • 计数器,秒杀(原子性

  • 去除大量数据中的重复数据(set

  • 构建队列(利用list

  • 发布订阅消息系统(pub/sub模式

常见NoSQL

Memcache

  • 不支持持久化
  • 存内存中

Redis

  • 支持持久化
  • 多种数据类型

MongoDB

  • 文档数据库
  • 支持二进制数据及大型数据存储

行式存储数据库

按行存储

Redis

  • KV
  • string
  • list
  • set
  • zset(sorted set)
  • 支持不同方式的排序
  • 缓存在内存中,能周期性的把更新的数据写入硬盘活着写入追加的记录文件
  • 在此基础上时间了主从同步

官网

www.redis.io
www.redis.cn

  • 默认16个db
  • 端口6379
  • 单线程 + 多路IO复用,串行操作

安装Redis

安装

先要安装gcc,然后再装

 # wget http://download.redis.io/releases/redis-6.2.1.tar.gz
 # tar xzf redis-6.2.1.tar.gz 
 # cd redis-6.2.1
 # make
 # make install

make 后src目录下会出现redis-server 与redis-cli

若make后报了好多错,可以用make distclean清楚一下再make一遍

make install 后 /usr/local/bin 目录中会出现redis-check-aof redis-cli redis-server redis-benchmark redis-check-rdb redis-sentinel
六个文件

  • redis-check-aof 修复有问题的aof文件
  • redis-cli 客户端
  • redis-server 服务器
  • redis-benchmark 性能测试工具
  • redis-check-rdb 修复有问题的rdb文件
  • redis-sentinel 集群Redis使用

启动

前台启动

# redis-server

后台启动

先复制一份redis.conf

然后把其中的daemonize no改成daemonize yes

# redis-server ///redis.conf的所在地/// 

命令

keys *查看当前库的所有key

exists [key]查看某个key是否存在

type [key]查看某个key是啥类型

del key删除指定的key数据

unlink key根据value选择非阻塞删除,没当时删除,真正的删除会在后续的异步操作中执行

expire [key] [time/s]time秒后key过期

ttl [key]查看key的过期时间,-1表示 永不过期,-2表示过期

select 1切换到1号库,默认有0-15号

dbsize当前库的key的数量

fluashdb清空当前库

flushall清空所有库

String

  • 二进制安全的,意味着string可以包含任何数据,比如jpg图片,或者序列化的对象
  • 一个Redis中的字符串value最大512M
  • simple dynamic string,SDS,动态字符串
  • 每次分配高于字符串长度,每次扩容翻倍,若大于1M,每次只会扩容1M

set 设置kv,如果k已经存在,则覆盖原value

get 得到value

strlen 得到value的字符串长度

EXPIRE <time_sec> 设置一定时间后key过期

setnx 如果不存在则设

append [key] [str]

incr [key] 一定要是数字值才能这样,value++

decr [key] 一定要是数字值才能这样,value--

incrby [key] [int]

decrby [key [int]

getrange [key] [start] [end] 获取从start 到end位的值,包括end

setrange [key] [start] [end] 设置从start 到end位的值,包括end

setex [key] [value] [time_sec]

sent [key] [value] 如果不存在就设置

mset 设置多个值

mget 获取多个值

msetnx 设置多个值,任何一个存在,则所有设置都失败

getset 先get再set

List

  • 单键多值

  • 底层是个双向链表,对两端操作性能比较高,对下标操作比较慢

  • 值在键在,值亡键亡

  • 底层是个quicklist

  • 元素少的时候是个ziplist,压缩链表

  • 数据量增加,多个压缩链表,组成一个quicklist

LPUSH [list_name] [ele1] [ele2] [ele3]
RPUSH [list_name] [ele1] [ele2] [ele3] 与LPUSH相似,但是是反着进的
LRANGE [lis_name] [start_position] [end_position]
LPOP [list_name] 会返回没掉的值,值取光的话,键就没了
RPOP [list_name] 会返回没掉的值,值取光的话,键就没了

rpoplpush 从k1右边吐一个值,加到k2的左边

lrange 取值
lrange k1 0 -1 取k1的所有元素

lindex 按照索引下标获取元素

llen 获取列表长度

linsert before 的前面插入

lrem 从value开始删n个,包括value

lset 将key中下标为index的值设为value

Set

  • 底层是个hash表

sadd ......将一个或者多个元素加入到key中,已经存在就就不用了

smembers 取出该集合的所有值

dismember 判断value是否在key中,在返回1,不在返回0

scard 返回该集合的元素个数

srem 删除某个元素

spop 随机吐出一个值

srandmember 随机取出n个值,不会删除

smove 把集合中的一个值从一个集合移到另一个集合

sinter 返回两个集合的交集元素

sunion 返回两个集合的并集元素

sdiff 返回差集,in key1 && not in key2

Hash

  • 是一个kv对的集合,是一个string类型的 field 和 value的映射表,很适合存储对象,类似Java里面的Map<String,Object>

hset 加值

hget 取值

hmset 批量加值

hexists 看key中是否有field

hkeys 列出该hash集合中的所有field

hvals 查看该hash集合中所有value

hincrby 给某key的某field的value加increment(如果是数字

hsetnx 如果这个hash集合中没这个field,才能加,否则加值不成功

Zset

  • 等价于Java的Map<String, Double>,又类似于Treeset
  • 跳跃表,给value排序根据score的范围,效率堪比红黑树,实现比红黑树简单

zadd

zrange [WITHSCORES] 返回角标范围内的成员

zrangebyscore [WITHSCORES] 返回范围在min与max之间的成员,顺序从小到大

zrevrangebyscore [WITHSCORES] 返回范围在min与max之间的成员,顺序从大到小

zincrby

zrem 删除指定值的元素

zcount 统计该集合,分数区间内的元素个数

zrange [WITHSCORES]

zrank

配置文件详解

从p13开始看



这篇关于__Redis总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程