redis基础

微信图片_20211010161510

Nosql AND Redis

Nosql概述

为什么用Nosql

我们生活在一个大数据的时代、普通数据库不能满足大数据的要求、所以要用Nosql数据库

源生Mysql

数据量访问太大、存放不下
数据索引(B+Tree)、内存放不下
访问量太大、服务器承受不了

源生Mysql

缓存+Mysql+垂直拆分(读写分离)主从副治

因为系统的90%都是在读取、所以为了减轻数据库的负担、所以用缓存来提高效率

缓存+mysql+垂直拆分

分库分表+水平拆分+Mysql集群

将不同的逻辑所需的数据存放到不同的表中、例如、像将订单、支付、登录业务数据存放到不同的数据库中、然后最后根据分布式将系统整合起来

分库分表+水平拆分+mysql集群

互联网公司服务流程

互联网公司现在基本设施

什么是Nosql

Nosql = Not Only Sql

Nosql不像关系型数据库那样、存储的是表格、行、列、Nosql的存储不需要一个固定的格式、像一些地图信息、社交网络、地理位置等都是用Nosql存储的、使用Map<String,Object>键值对的形式来控制的

Nosql的特点

  • 解耦

  • 方便扩展(数据之间没有关系)

  • 大数据量高性能(Redis一秒可以写8万次、一秒可以读11万次、性能较高)

  • 数据类型多样性(不需要事先设计数据库、随取随用)

传统的RDBMS 和 Nosql的区别

传统的RDBMS

  • 结构化组织
  • SQL
  • 数据和关系都存在单独的表中
  • 数据定义语言
  • 严格的一致性
  • 基础的事务

Nosql

  • 不仅仅是数据
  • 键值对存储、列存储、文档存储、图形数据库(社交)
  • 最终一致性
  • CAP定理和BASE
  • 高性能、高可用、高可控

阿里巴巴演进史

商品的基本信息

RDBMS+Nosql

商品的描述、评论(文字较多)

文档型数据库、MongoDB

图片

分布式文件系统 FastDFS
淘宝自己的 TFS
Gooale的 GFS
Hadoop的 HDFS
阿里云的 OSS

商品关键字(搜索)

搜索引擎 Solr elasticsearch
Iserach

商品热门的波段信息

内存数据库
Redis Tair Memache

Nosql的四大分类

KV键值对

Redis

文档型数据库

MongoDB
MongoDB基于分布式文件存储数据库、C++编写、用来处理大量的文档
MongoDB介于关系数据库和非关系数据库中间的产品、最像关系数据库的数据库

列存储数据库

HBase
分布式文件系统

图关系数据库

Neo4j
InfoGrid
他存放的是关系、而不是图形、例如、社交网络、广告推荐

Nosql四大分类的对比

Nosql四大分类的对比图
图片来源于网络

Redis

Redis概述

Redis(Remote Dictionary Server ),即远程字典服务、结构化数据库

是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。

Redis的功能

  • 1、内存存储、持久化(rdb、aof)
  • 2、效率高、可以用于高速缓存
  • 3、发布订阅系统
  • 4、地图信息分析
  • 5、计时器、计数器(浏览量)

Redis特性

  • 1、多样的数据类型
  • 2、持久化
  • 3、集群
  • 4、事务

Redis Windows系统下的操作

下载Redis压缩包、解压即可、四个服务

windows的redis四个服务

redis-server.exe:redis启动服务
redis-cli.exe:redis客户端服务
redis-check-aof.exe:检查持久化的文件是否正确
redis-benchmark.exe:测试性能的

Redis服务的启动

redis服务启动成功

Redis客户端的启动

redis客户端连接

Redis在Linux系统下的操作

1、下载Redis压缩包、解压安装即可 程序会安装到/opt 目录下

2、解压后进入安装目录下去下载所需的相关组件

yum install gcc-c++

make

make install

3、寻找Redis默认安装路径 /usr/local/bin

4、在安装路径下新建一个config文件夹、然后将redis的redis.config文件复制到此目录下、以后操作这个配置文件就行了、一点出错、不会收到什么影响

5、修改配置文件中的 daemonize 将它从no 改为 yes

6、启动Redis服务 命令 redis-server 配置文件路径/配置文件名 就是启动服务、并告诉服务按照哪个配置文件启动

7、启动Redis连通测试 命令 redis-cli -p 端口号

8、查看Redis进程服务 命令 ps -ef|grep redis

9、关闭Redis服务 命令 shutdown

Redis性能测试

redis-benchmark -h localhost -p 6379 -c 100 -n 100000

redis性能测试表

Redis基础知识

Redis有16个数据库

默认使用第0个数据库

Redis基本命令

Redis命令大全直通车
http://www.redis.cn/commands.html

SELECT 第几个库 切换数据库

DBSIZE 查看当前数据库的大小

KEYS * 查看当前数据库的所有key

flushdb 删除当前数据库的所有内容

flushAll 清除所有数据库的内容

Redis的端口号为什么是6379

因为作者喜欢的一个明星的名字用9键输入法打出来就是6379

Redis是单线程的为什么还这么快

因为Redis是基于内存的、CPU并不是Redis的瓶颈、Redis的瓶颈是机器的内存和网络带宽有关、因为使用单线程可以实现、所以就使用了单线程

Redis是将所有的数据存放到内存中、所以说单线程去操作效率是最高的、因为CPU会上下文切换、这个过程会耗时、对于内存系统来说、没有上下文切换效率就是最高的

Redis五个基本类型

String(字符串)

EXISTS key名 判断这个键是否存在

move key名 哪个库 移除当前的key

EXPIRE key名 过期时间(这个是秒) 设置key过期时间

ttl key名 查看剩余过期时间

type key名 查看key的类型

append key名 " love" 追加内容

strlen key名 获取到内容的长度

incr key名 使其数据 + 1

decr key名 使其数据 - 1

incrby key名 你要设置的步长 设置每次增加的数量

decrby key名 你要设置的步长 设置每次减少的数量

getrange key名 起始位置 要截取的位置 查看指定范围内的数据

setrange key名 起始位置 要替换的内容 替换指定位置的数据

setex key名 过期时间 设置过期时间

setnx key名 过期时间 不存在时在设置、如果存在则创建失败(分布式锁中常常使用)

mset key名 值 key名 值 key名 值 批量操作、设置k和v

mget key名 key名 key名 批量操作、取到多个key

msetnx key名 值 key名 值 原子性操作、要么一起成功、要么一起失败

getset key名 值 先get、后set、如果不存在则返回nil、如果存在则返回刚刚赋的值、并设置新的值

应用场景

  • 计数器
  • 统计多单位数量
  • 粉丝数
  • 对象缓存存储

List(列表)

我们可以把List运用成栈、对列、阻塞对列

两边插入或者改动效率最高、中间元素相对效率低些

消息排队、消息队列(Lpush Rpop)左进右出

栈(Lpush Lpop)左进左出

lpush key名 值 将一个值或多个值插入到列表的头部、也可以想象成是左边

lrange key名 起始数据下标 末尾数据下标 获取List中的值(0 -1)获取所有的值

rpush key名 值 将一个值或多个值插入到列表的尾部、也可以想象成是右边

lpop key名 移除第一个元素、头部、也就是左边的

rpop key名 移除最后一个元素、尾部、也就是右边的

lindex key名 要查找元素的下标 查询指定下标的内容

llen key名 判断数据的长度

lrem key名 要移除的数量 要移除的数据内容 移除指定数据内容和个数

ltrim key名 起始位置 结束位置 截取指定范围内的数据、使其内容只剩下截取的内容

rpoplpush 原key名 新key名 移除列表中的最后一个元素、将它移动到新的列表中

exists key名 判断这个列表是否存在

lset key名 要修改的下标 要修改成的内容 修改列表中的数据、前提是这个数据得存在、否则报错

linsert key名 前面插入(before)/后面插入(after) 插入位置的数据名 要插入的内容 在指定位置的前面或后面插入数据

Set(集合)

set的值是不能重读的

set是无序不重复的

sadd key名 值 向set中添加元素

smembers key名 查看set中的所有值

sismember key名 值 判断该key中的这个值是否存在

scard key名 获取该key中的元素个数

srem key名 值 移除元素中的指定元素

srandmember key名 要查询的个数 随机查询出内容

spop key名 弹出数量 随机弹出元素

smove 要移动的key名 移动到指定位置的key名 要移动的元素 从一个key中移动元素到指定key中

sdiff 要比较的key名 被比较的key名 返回差集 返回与被比较的key不同的元素

sinter 要比较的key名 被比较的key名 返回交集

sunion 要比较的key名 被比较的key名 返回并集

Hash(哈希)

存放形式和java的map差不多、只不过就是把整个map集合当成值了

形式: key key - value

hset key名 哈希key名 值 向hash中添加元素

hget key名 哈希key名 获取hash中的全部元素

hmset key名 哈希key名 值 哈希key名 值 批量添加元素

hmget key名 哈希key名 哈希key名 批量获取元素

hgetall key名 查看所有key中的元素

hlen key名 判断hash长度

hkeys key名 查询hash中的key中的哈希key

hvals key名 查询hash中的key中的值

hsetnx key名 hashkey名 值 如果不存在则创建、如果存在则无法创建

hash适合对象存储、string适合字符串存储

Zset(有序集合)

也是一个集合、和set集合一样、但是这个是有排序的

zadd key名 序号(例如、工资) 值 像zset集合中添加元素

zrange key名 0 -1 查询集合中的全部信息

zrangebyscore key名 min最小值(-inf 负无穷) max最大值(+inf 正无穷) withscores(显示序号) 排序后显示信息(从小到大)

zrem key名 值 移除集合中的元素

zcard key名 判断集合中key的数量

zrevrange key名 0 -1 从高到低查询全部信息

zcount key名 最小值 最大值 获得区间数据条数

zset应用场景

  • 存储班级成绩表、工资表排序等

  • 排行榜 top N

三种特殊数据类型

geospatial(地理位置)

geoadd

geoadd key名 经度 纬度 值(城市名) 添加地理位置的经纬度

geopos

geopos key名 值 key名 值 ... 查询地理位置的经纬度

geodist

判断两人之间的距离

单位

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺

geodist key名 值(地点) 值(地点) 单位(km/m/mi/ft) 计算出两个城市之间的直线距离

georadius

附近的人

给出一个经纬度、在给出一个范围、可查询当前范围内的信息

georadius key名 经度 纬度 距离 单位 withdist(显示距离) withcoord(显示查询到的详细经纬度) count 数量(显示几条查询到的信息) 查看你已经存入的城市中有哪些城市在这个经纬度范围内

GEORADIUSBYMEMBER

地图

根据城市查询范围内的信息

georadiusbymember key名 值(城市) 数量(距离) 单位(km/m/mi/ct) 查看这个城市范围内的城市

GEOHASH

城市的Hash值、字符串

geohash key名 值 值 值... 将二维的经纬度转换为一维的字符串

删除地理位置

因为geo底层原理是zset、所以删除即可用zset完成

zrange key名 0 -1 查看地图中全部信息

zrem key名 值... 删除地理位置信息

hyperloglogs(基数统计)

基数统计的算法、一种数据结构

优点:占用的内是固定的 非常的小 大概12kb 0.81%错误率

应用范围: 网页的UV(互联网访问、浏览这个网页的自然人)

pfadd key名 值 值 值 值... 添加信息

pfcount key名 查看数据数量

pfmerge 合并后的key名 要合并的key名 要合并的key名 将多个key合并成新的key但是是基数、不重复的

bitmaps(位图)

一种数据结构、操作二进制位来进记录、只有0和1两个状态

应用场景

  • 统计用户信息
  • 活跃、不活跃
  • 登录、未登录
  • 打卡

两个状态的都可以使用bigmaps

setbit key名 值 存储的值(0/1) 设置存储状态

getbit key名 值 查看数据状态

bitcount key名 查看状态为1的信息数量

正确的开始、微小的长进、然后持续、嘿、我是小博、带你一起看我目之所及的世界……

-------------本文结束 感谢您的阅读-------------

本文标题:redis基础

文章作者:小博

发布时间:2021年10月10日 - 16:38

最后更新:2021年10月10日 - 16:40

原始链接:https://codexiaobo.github.io/posts/2025154759/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。