Redis简单入门

Redis概述

Redis是什么?
Redis(Remote Dictionary Server),即远程字典服务!
是一个开源的使用ANSI C语言编写、支持网络、可基于内存也可持久化的日志型、Key-Value数据库,并提供多语言的API
Redis简单入门
文章图片

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)
Redis简单入门
文章图片

注意:Window在Github上下载(停更很久)不建议
测试性能
Redis在Linux安装好之后会发现redis-benchmark
Redis简单入门
文章图片

redis-benchmark:是一个压力测试工具
官方自带的性能测试工具
redis-benchmark命令参数
Redis简单入门
文章图片

我么们来简单测试一下:
测试100个并发连接100000请求 redis-benchmark -h localhost -p 6379 -c 100 -n100000

Redis简单入门
文章图片

如何查看这些分析:
Redis简单入门
文章图片

基础知识 redis默认有16个数据库
redis.conf里
Redis简单入门
文章图片

默认使用第0个数据库
可以使用select进行切换select
Redis简单入门
文章图片

Redis简单入门
文章图片

查看所有的keykeys *
Redis简单入门
文章图片

清空当前数据库里的数据flushdb
Redis简单入门
文章图片

清除所有数据库里的数据:flushall
Redis简单入门
文章图片

Redis是单线程的!
Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器内存和网络带宽,
Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样使用key-value的Memecache差!
Redis 为什么单线程还这么块?
1、误区1:高性能的服务器一定是多线程的
2、误区2:多线程(CPU上下文会切换)一定比单线程效率高!
核心:redis是将所有的数据全部放在内存中的,所以使用单线程去操作 效率就是最高的,多线程(CPU的上下文切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的。
Redis常见的五大数据类型 Redis简单入门
文章图片

全段翻译:
Redis简单入门
文章图片

Redis-Key
Redis简单入门
文章图片

Redis简单入门
文章图片

其他命令请到官网查看帮助文档:
Redis简单入门
文章图片

String
Redis简单入门
文章图片

步长

Redis简单入门
文章图片

字符串范围 range

Redis简单入门
文章图片

替换

Redis简单入门
文章图片

setex (set with expire) #设置过期时间 setnx (set if not exist) #不存在再设置(在分布式锁中会常常使用)

Redis简单入门
文章图片

mset mget

Redis简单入门
文章图片

对象 set user:1{name:zhangsan,age:3} #设置一个user:1对象 值为json字符来保存一个对象! 这里的key是一个巧妙的设计:user:{id}:{filed},如此设计在Redis中完全ok!

Redis简单入门
文章图片

getset #先get然后再set

Redis简单入门
文章图片

数据结构是相同的!
String类似的应用场景:value除了是字符串还可以是数字
  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储
List
在redis里我们可以把list玩成,栈、队列、阻塞队列!
所有list命令都是用 l 开头的,Redis不区分大小写 LPUSH RPUSH

Redis简单入门
文章图片

LPOP RPOP

Redis简单入门
文章图片

LINDEX

Redis简单入门
文章图片

LLEN

Redis简单入门
文章图片

移除指定的值 LREM

Redis简单入门
文章图片

Ltrim:修剪 :list 截断!

Redis简单入门
文章图片

rpoplpush #移除列表的最后一个元素,将它移动到新的列表中

Redis简单入门
文章图片

lset #将列表中指定下标的值替换为另外一个值跟新操作

Redis简单入门
文章图片

Linsert #将某个具体的value插入到列表中现有的value之前或之后

Redis简单入门
文章图片

list小结:
  • 它实际上是一个链表,before Node after ,left,right都可以插入值
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也表示不存在!
  • 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
消息队列!消息队列(Lpush Rpop),栈(Lpush Lpop)!
Set(集合)
set中的值是不能重复的 sadd #添加元素 smembers #查看set中所有值 sismember #判断一个值是否在set集合中

Redis简单入门
文章图片

srem #移除指定的vlue

Redis简单入门
文章图片

set 无序不重复集合,抽随机 srandmember

Redis简单入门
文章图片

set 无序不重复集合,抽随机 spop :随机删除

Redis简单入门
文章图片

将一个指定的值,移动到另外一个set集合中 smove

Redis简单入门
文章图片

数字类集合 - 差集 sdiff - 交集 sinter (共同关注可以这样实现) - 并集 sunion

Redis简单入门
文章图片

Hash(哈希)
本质和String类型没有太大区别,还是一个简单的key-value 这里的value是hash值
简单来说 就是
set表名字段名字段值

Redis简单入门
文章图片

hdel :删除hash指定的key; 对应的value也删除

Redis简单入门
文章图片

hlen:获取hash内容的长度

Redis简单入门
文章图片

hexists:判断hash表中是否存在指定字段

Redis简单入门
文章图片

hkeys 只获取filed hvals 只获取value

Redis简单入门
文章图片

incr

Redis简单入门
文章图片

hash 更适合对象的存储,String更适合字符串存储
Zset(有序集合)
在set的基础上,增加 了一个值.
Set: set k1 v1
Zset: zset k1 score1 v1
zadd

Redis简单入门
文章图片

排序如何实现 升序:zrangebyscore key min max 降序:zrevrangbyscore key max min

Redis简单入门
文章图片

zrem #移除zset集合中的元素

Redis简单入门
文章图片

zcard #获取集合的内容长度

Redis简单入门
文章图片

zcount #获取指定区间的内的成员数量

Redis简单入门
文章图片

Zset的应用场景:
1、存储班级成绩,工资表排序
2、重要消息,带权重进行判断
3、排行榜应用实现,取Top N测试
三种特殊特殊数据类型 geospatial(地理位置)
朋友的定位,附近的人,打车距离计算
Redis的Geo在Redis3.2版本推出,这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
只有6个命令
geoadd#添加地理位置 参数 key (经度 纬度 名称)有效的经度从-180度到180度。 有效的纬度从-85.05112878度到85.05112878度。 当坐标位置超出上述指定范围时,该命令将会返回一个错误。# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入

Redis简单入门
文章图片

geopos #获取指定的城市的经度和纬度 获得当前定位,一定是一个坐标值

Redis简单入门
文章图片

geodist #两人之间的距离! 单位 * m 表示单位米。 * km 表示单位千米 * mi 表示单位 英里。 * ft 表示单位 英尺

Redis简单入门
文章图片

georadius # 以给定的经纬度为中心,找出某一半径内的元素我附近的人?(获得所有附近的人的地址,定位!)通过半径来查询 参数 : *count 获得指定数量的人所有数据要先录入:china:city,才会让结果清晰

Redis简单入门
文章图片

georadius 参数:georadiusbymenmer 中心点是 城市 ,找到指定元素周围的元素

Redis简单入门
文章图片

GeoHash #返回一个或多个位置元素的Geohash表示 该命令将返回11个字符的Geohash字符串 如果两个字符串越接近,那么距离越近。

Redis简单入门
文章图片

geo 的底层的实现原理其实就是Zset! 我们可以用Zset的命令来操作geo

Redis简单入门
文章图片

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%的错误率,可忽略不计
Redis简单入门
文章图片

如果允许容错,那么一定可以使用Hyperloglog
如果不允许容错,就使用set或者自己的数据类型即可
bitmaps
位存储
统计用户信息,活跃,不活跃! 登录、未登录! 打卡,未打卡。两个状态的,都可以使用Bitmaps!
bitmaps位图,数据结构! 都是操作二进制位来进行记录,就只有0和1两个状态
使用bitmaps 来记录 周一到周日的打卡!

周一:1 周二:0 周三:0…
Redis简单入门
文章图片

getbit 查看某一天是否有打卡

Redis简单入门
文章图片

bticount #统计操作,统计打卡的天数!

【Redis简单入门】Redis简单入门
文章图片

    推荐阅读