Redis概述
Redis是什么?Redis(Remote Dictionary Server),即远程字典服务!
是一个开源的使用ANSI C语言编写、支持网络、可基于内存也可持久化的日志型、Key-Value数据库,并提供多语言的API
文章图片
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
免费和开源!是当下最热门的NoSQL技术之一!也被人们称之为结构化数据库!
Redis能干嘛?1、内存存储、持久化,内存中是断电即失、所以持久化很重要(rdb、aof)
2、效率高,可以用于高数缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量!)
。。。。。
特性1、多样的数据类型
2、持久化
3、集群
4、事务
。。。。
学习中需要用到地方东西1、狂神的公众号:狂神说
2、官网:https://redis.io
3、中文网:http://www.redis.cn
4、下载地址:官网上下载(Linux)
文章图片
注意:Window在Github上下载(停更很久)不建议
测试性能Redis在Linux安装好之后会发现redis-benchmark
文章图片
redis-benchmark:是一个压力测试工具
官方自带的性能测试工具
redis-benchmark命令参数
文章图片
我么们来简单测试一下:
测试100个并发连接100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n100000
文章图片
如何查看这些分析:
文章图片
基础知识 redis默认有16个数据库
redis.conf里
文章图片
默认使用第0个数据库
可以使用select进行切换select
文章图片
文章图片
查看所有的keykeys *
文章图片
清空当前数据库里的数据flushdb
文章图片
清除所有数据库里的数据:flushall
文章图片
Redis是单线程的!Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器内存和网络带宽,
Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样使用key-value的Memecache差!
Redis 为什么单线程还这么块?
1、误区1:高性能的服务器一定是多线程的
2、误区2:多线程(CPU上下文会切换)一定比单线程效率高!
核心:redis是将所有的数据全部放在内存中的,所以使用单线程去操作 效率就是最高的,多线程(CPU的上下文切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的。
Redis常见的五大数据类型
文章图片
全段翻译:
文章图片
Redis-Key
文章图片
文章图片
其他命令请到官网查看帮助文档:
文章图片
String
文章图片
步长
文章图片
字符串范围 range
文章图片
替换
文章图片
setex (set with expire) #设置过期时间
setnx (set if not exist) #不存在再设置(在分布式锁中会常常使用)
文章图片
mset
mget
文章图片
对象
set user:1{name:zhangsan,age:3} #设置一个user:1对象 值为json字符来保存一个对象!
这里的key是一个巧妙的设计:user:{id}:{filed},如此设计在Redis中完全ok!
文章图片
getset #先get然后再set
文章图片
数据结构是相同的!
String类似的应用场景:value除了是字符串还可以是数字
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
在redis里我们可以把list玩成,栈、队列、阻塞队列!
所有list命令都是用 l 开头的,Redis不区分大小写
LPUSH
RPUSH
文章图片
LPOP
RPOP
文章图片
LINDEX
文章图片
LLEN
文章图片
移除指定的值
LREM
文章图片
Ltrim:修剪 :list 截断!
文章图片
rpoplpush #移除列表的最后一个元素,将它移动到新的列表中
文章图片
lset #将列表中指定下标的值替换为另外一个值跟新操作
文章图片
Linsert #将某个具体的value插入到列表中现有的value之前或之后
文章图片
list小结:消息队列!消息队列(Lpush Rpop),栈(Lpush Lpop)!
- 它实际上是一个链表,before Node after ,left,right都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也表示不存在!
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
Set(集合)
set中的值是不能重复的
sadd #添加元素
smembers #查看set中所有值
sismember #判断一个值是否在set集合中
文章图片
srem #移除指定的vlue
文章图片
set 无序不重复集合,抽随机
srandmember
文章图片
set 无序不重复集合,抽随机
spop :随机删除
文章图片
将一个指定的值,移动到另外一个set集合中
smove
文章图片
数字类集合
- 差集 sdiff
- 交集 sinter (共同关注可以这样实现)
- 并集 sunion
文章图片
Hash(哈希)
本质和String类型没有太大区别,还是一个简单的key-value 这里的value是hash值
简单来说 就是
set表名字段名字段值
文章图片
hdel :删除hash指定的key;
对应的value也删除
文章图片
hlen:获取hash内容的长度
文章图片
hexists:判断hash表中是否存在指定字段
文章图片
hkeys 只获取filed
hvals 只获取value
文章图片
incr
文章图片
hash 更适合对象的存储,String更适合字符串存储Zset(有序集合)
在set的基础上,增加 了一个值.
Set: set k1 v1
Zset: zset k1 score1 v1
zadd
文章图片
排序如何实现
升序:zrangebyscore key min max
降序:zrevrangbyscore key max min
文章图片
zrem #移除zset集合中的元素
文章图片
zcard #获取集合的内容长度
文章图片
zcount #获取指定区间的内的成员数量
文章图片
Zset的应用场景:三种特殊特殊数据类型 geospatial(地理位置)
1、存储班级成绩,工资表排序
2、重要消息,带权重进行判断
3、排行榜应用实现,取Top N测试
朋友的定位,附近的人,打车距离计算
Redis的Geo在Redis3.2版本推出,这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
只有6个命令
geoadd#添加地理位置
参数 key (经度 纬度 名称)有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入
文章图片
geopos #获取指定的城市的经度和纬度
获得当前定位,一定是一个坐标值
文章图片
geodist #两人之间的距离!
单位
* m 表示单位米。
* km 表示单位千米
* mi 表示单位 英里。
* ft 表示单位 英尺
文章图片
georadius # 以给定的经纬度为中心,找出某一半径内的元素我附近的人?(获得所有附近的人的地址,定位!)通过半径来查询
参数 :
*count 获得指定数量的人所有数据要先录入:china:city,才会让结果清晰
文章图片
georadius
参数:georadiusbymenmer
中心点是 城市 ,找到指定元素周围的元素
文章图片
GeoHash #返回一个或多个位置元素的Geohash表示
该命令将返回11个字符的Geohash字符串
如果两个字符串越接近,那么距离越近。
文章图片
geo 的底层的实现原理其实就是Zset! 我们可以用Zset的命令来操作geo
文章图片
hyperloglog
什么是基数?A{1,3,5,6,7,5}
B{1,3,5,6,7}
基数(不重复的元素) = 5,可以接受误差!
Redis 2.8.9 版本就更新了Hyperloglog数据结构
网页的UV(访问量):实现一个人访问一个网站多次,但是还是算作一个人
- 传统的方式,set保存用户的id,然后统计set中元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id
- Redis Hyperloglog基数统计的算法!
优点 : 占用的内存固定,2^64不同元素的技术,只需要12KB的内存。如果从内存的角度来比较的话Hyperloglog首选
hperloglog 0.81%的错误率,可忽略不计
文章图片
如果允许容错,那么一定可以使用Hyperloglog
如果不允许容错,就使用set或者自己的数据类型即可
bitmaps
位存储统计用户信息,活跃,不活跃! 登录、未登录! 打卡,未打卡。两个状态的,都可以使用Bitmaps!
bitmaps位图,数据结构! 都是操作二进制位来进行记录,就只有0和1两个状态
使用bitmaps 来记录 周一到周日的打卡!
周一:1 周二:0 周三:0…
文章图片
getbit
查看某一天是否有打卡
文章图片
bticount #统计操作,统计打卡的天数!
【Redis简单入门】
文章图片