redis基础
Nosql AND Redis
Nosql概述
为什么用Nosql
我们生活在一个大数据的时代、普通数据库不能满足大数据的要求、所以要用Nosql数据库
源生Mysql
数据量访问太大、存放不下
数据索引(B+Tree)、内存放不下
访问量太大、服务器承受不了
缓存+Mysql+垂直拆分(读写分离)主从副治
因为系统的90%都是在读取、所以为了减轻数据库的负担、所以用缓存来提高效率
分库分表+水平拆分+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四大分类的对比
图片来源于网络
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压缩包、解压即可、四个服务
redis-server.exe:
redis启动服务redis-cli.exe:
redis客户端服务redis-check-aof.exe:
检查持久化的文件是否正确redis-benchmark.exe:
测试性能的
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有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 国际 转载请保留原文链接及作者。