Redis基础笔记(上)

Redis基础(上)

Redis是非关系型数据库。NoSql的优势:易拓展,大数据、高性能,灵活的数据类型。
Redis:Remote Dictionary Server 远程字典服务
默认端口号6379

需要的Linux命令

1.ifconfig查看IP地址 查找inet后面对应的IP地址 是sercureCrt客户端连接虚拟机地址使用的
2.ll查看当前目录下的所有文件
3.cd = change directory进入指定目录
cd~返回初始目录
cd redis-5.0.6 这是redis 的安装包目录
4.vim redis.conf打开当前文件
可以上下键可以移动光标
输入:q退出打开的状态,回到文件显示的窗口

Redis启动命令

1.redis-sever 启动服务端的命令,但是需要保持当前窗口状态
打开新的窗口 使用 clone session 方法
2.redis - cli -p 6379 启动客户端的命令,需要通过参数-p 指定端口号
输入ping 会 返回 pong
3.set key1 “hellow word” 设置key1的值为hello word 返回 ok
4.get key1 返回 "hello word " 说明数据可与i正常获取
5.exit 退出 退出当前的连接,shutdown 关闭服务 然后再执行一次 exit完全关闭
6.redis-benchmark 压测命令
测试再不同命令下,10w次请求在多长时间内完成
官方标准是达到10w/s的get/set

Redis操作命令

1.keys *
查看数据库查看当前数据可以所有的key值
系统会设置3个默认key额外使用
2.select 1 切换到1号数据库
get key1 获取key 如果为空返回nil
通过127.0.0.1:6379[?]后边?的值可以知道访问的数据库的名称
3.keys key?
匹配方式的使用
对于存在key1 key2 key3
keys key? 可以找到
keys k??? 可以找到
说明?是一个匹配符,并且有占位的功能,并且效率更高
4.dbsize
展示数据库中key的个数
5.flushdb
删库的操作
6.flushall
删除所有数据库

Redis键值操作命令

1.exists key1 是否存在的命令
返回1 证明存在
2.type key2 显示当前键值存储的数据类型
3.expire key1 10 设置key值的有效时间为10 秒,过了有效期,key的值置为空
4.ttl key1 还剩多长时间有效,正数代表未过期,负数如下,单位是秒 pttl 毫秒级单位
当返回-2时,key不存在
当返回-1时,key没设置有效时间
5.persist key2 设置数据一直有效,特别作用于错误设置了有效期之后
6.del key2 删除key
7.rename key2 key1 把key2重命名成key1
8.move key2 +dbid 移动指定key 到另一个数据库中,dbid是数据库编号

数据结构

Redis数据结构一 String

String类型是Redis最基本的数据类型,一个键最大能存储512MB。String类型是二进制安全的。意思是redis的String可以包含任何数据
原理:redis的字符串是动态字符串,内部结构雷系ArrayList。采用预分配冗杂空间的方式减少内存的频繁分配。内部为字符串分配的实际空间一般高于字符串长度,当字符串长度<1mb时,扩容方式时直接加倍,如果>1mb一次扩容之扩容1mb知道扩大到512mb

命令

CRUD :set/get/del/getset/setex/setnx
批量 : mget/mset/msetnx
字符串操作 : append/strlen/getrange/setrange
自增/自减 : incr/incrby/decr/decrby

使用

1.strlen 查看字符串的长度
2.append 改变字符串的长度
eg:append key1 “222”
3.当value的值是整数时,可以通过命令直接进行数学运算
incr自增,返回最新的值
decr自减,返回最新的值
incrby增加,区别是增加计算的参数
eg:incrby key11 3
decrby减少,同上
4.范围内操作的命令
getrange 获取从初始位置到结束位置的值类似于subString
eg:getrange key start end
setrange 设置从起始位置开始替换指定位置为新的字符串
eg:setrange key strat newStr
setrange key 5 333
hellow111222 ==>hellow333222
5.整合命令
setex = set +expire
eg:setex + key + 时间 + value
setnx = set + exists = set if not exists
eg:setnx + key + value
如果key不存在,则设置数据返回1,如果存在不设置返回0,getset 先取出原来的值,在设置为新值,返回旧值
eg:getset+key+value
6.批量操作
mget = more get
eg:mget +key1+key2+key3
mset = more set一次设置多个key和value,参数本身是个map
eg:mset +key1 +value1 +key 2 +value
msetnx 同上

Redis数据结构二 List

redis的列表是一个字符链表,内部结构类似LinkedList。left,right都可以添加插入。如果键不存在,创建新的链表。如果键已经存在,新增内容,如果键全移除,对应键也就消失了

原理

底层是一个快速链表(quicklist)结构,在列表元素较少时,使用练习的内存存储成压缩列表ziplist。当数据量较多时,改成quicklist,也就是将多个ziplist使用双向指针串起来使用,以减少内存的碎片化

命令

队列操作(先进后出):rpush/lrange/llen/lpop
栈操作(先进后出):rpush/rpop | | lpush /lpop
遍历操作:lindex/ltrem/lset+index/linsert+before | | after
范围操作:rpoplpush/ltrim

使用

栈和队列 ----> 数据结构
1.存取操作 push pop range
lpush:从左侧存入数据------->栈结构 弹出时 执行lpop(从左侧弹出)
rpush:从右侧存入数据------->队列结构 弹出时 执行lpop(从左侧弹出)
lrange:范围内查看数据
eg:lrange key start end
lpush list1 1 2 3 4 5
lrange list1 1 0 -1
5 4 3 2 1
rpush listr 1 2 3 4 5
lrange listr 1 0 -1
1 2 3 4 5
lpop list1
5
lpop list2
1
2.对list本身的操作
llen:查看长度
lindex:获取某一个位置的值,下角标从0开始
lrem:删除n个value的值
eg: lrem key N value
ltrim:截取某个范围的数据重新赋值给key
eg:ltrim key start end (下角标从0开始)
linsert:插入数据的某个位置的前后 在旧的value 的前或后插入新的value
eg: linsert key before/after oldVlue newValue
如果要插入数据到头部还可以使用lpushx
eg: lpushx key value
如果插入数据到尾部可以使用 rpushx
eg: rpushx key value
lset:可以更改指定位置的值
eg:lset key index value

Redis数据结构三 Hash

redis的无需字典是一个String类型的filed和value的映射表,内部结构类似HashMap。每个hash可以存储2^32-1个键值对

原理

底层实现结构,于HashMap 是一样的,时数组 + 链表的二维结构,第一维hash的数据位置碰撞时,将碰撞元素永链表串接起来,不同的是,redis字典的值只能是字符串,两者的rehash方式不同。java的hashmap是一次全部rehash,耗时较高,redis为了优化性能,采用渐进式rehash策略。具体方式为,同时保留新旧两个hash结构,然后逐步搬迁,搬迁完成后在取而代之

命令

CRUD:hset/hget/hmset/hdel/hsetnx
遍历操作:hgetall/hlen/hexists/hkeys/hvals
数值操作:hincrby/hincrbygloag

HashMap<String,String> -----> String
HashMap<String,List> -----> List
HashMap<String,Map> -----> Hash

使用

1.存取数据
hset hset hash1 key1 value1
hget hget hash1 key1 =>value1
hmset/hmget 批量处理数据
hsetnx 如果不存在即set新的key值
2.遍历数据
hkeys 查看所有的key值
hvals 查看所有的value值
hlen 查看数据长度
hgetall 返回全部的key和value
hexists 判断是否存在某哦个key,存在返回1,不存在返回0
3.变更数据
hdel:删除数据
eg:hdel hash_key field_key
hincrby 对整数的增加操作, 指定增加的范围
eg:hincrby key field_key num

Redis数据结构四 Set

redis的集合是string类型的无序不重复元素集。同时提供交集,并集,差集等操作。集合中最大的成员数为2^32-1

原理

类似HashSet,也是通过哈希表实现的,相当于所有的value都是空。通过计算hash的方式来快速排重,也是set能提供判断一个成员是否在集合内的原因

命令

CURD:sadd/srem/spop
遍历操作:scard/semembers/sismember/srandmember
交叉操作:smove/sdiff/sinter/sunion

使用

1.读写操作:
1.sadd 创建set类型的value,
eg:sadd set1 1 2 3 4 4 3 2 1
2.scard 查看set的大小
3.smembers 查询set中所有的值
4.sismember key value 判断value 是否在key所对应的set中,如果在的化返回1不在的话返回0
2.更新操作
1.srem key value 删除一至多个数据的值
2.srandmember 可以在set中随机出num个元素
eg: srandmember set num
3.spop 随机弹出num个元素
3.交互操作
smove 移动元素value从key1到key2
eg:smove key1 key2 value
4.交集并集差集
1.sinter key1 key2 求两个集合的交集(两者都有的元素)
2.sdiff key1 key2 返回存在在key1 中但不存在key2中(求差集)
3.sunion key1 key2 返回并集(两个集合中所有元素)
拓展问题
在list中,如何求差集并集交集
方法
交集 retainAll()
差集 removeAll()
并集 addAll()

Redis数据结构五 Zset

redis的有序集合和set也是一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis 正式通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score) 却可以重复

原理

类似于SortedSet和HashMap的结合,内部实现是一种叫“跳跃列表”的数据结构。通过层级制,将元素分层并串联,每隔几个元素选出一个代表,再将代表使用另外一个指针串起来,以此类推,形成金字塔结构。同一个元素在不同层级之间身兼数职,是为“跳跃”。新元素插入时,逐层下潜,直到找到合适的位置

命令

CRUD:zadd/zrem/zrange+withscores
范围操作:zrangebyscore+用"("代表不包含+limit
统计操作:zcard/zcount/zrank
逆序操作:zrevrank/zrevrange/zrevrangebyscore

使用

1.读取操作
1.zadd: 创建或增加zset的元素值,每一个元素值都包含<分数,value>
eg:zadd key1 score1 value1 score2 value2
2.zrange: key1 start end 指定在start到end的范围内查看元素
如果要查看分数,加上withscores
3.zrangebyscore key1 minScore maxScore
指定分数范围内查询元素,参数说明 分数前增加“(”代表开区间(不包含当前值)
支持分页的操作 limit + offset(偏移量)+num(返回的数量)
4.zrem key1 + value 删除指定的value
2.统计层
1.zcard+key 统计元素个数
2.zcount + key +minScore+maxScore 统计给定分数范围内的元素个数
3.zscore + key +member 查询指定成员的分数
4.zrank + key +member 返回指定成员的索引位置(因为有序,所以位置代表排名)
5.zrevrank + key +member 默认从低到高排序,逆序正好代表排名
6.zrevrange 原来是从小到大排序,逆序后从大到小排序

Redis数据结构六 GEO

GEO可以将用户给定的地理位置信息储存起来。名字取自业界通用的地理位置距离排序算法GeoHash,将二维的经纬度数据映射到一维的整数,也就是挂载到一张纸上,方便计算两点之间的距离,实际内部结构是zset

原理:

映射算法,将地球堪称一个二维平面,划分成一系列正方形的方格,所有地图坐标都被防止于唯一的方格中,然后进行证书编码(如切蛋糕法),编码越接近的方格距离越近

命令

基础操作:geoadd/geopos/geodist
获取定位:gathash(拿到结果去geohash。org网站查询)
查询附近:georadius/georadiusbymember

使用

1.geoadd + key +经度 + 纬度 +成员名
通过经纬度存储地址,支持存储多个
2.geodist + key + member1 +member2 +距离单位
查询两个地点之间的相对距离
距离单位支持 : m(米) km(千米) mi(英里) ft(英尺)
3.geopos 查询成员经纬度数据
4.geohash 进行hash编码,得到编码结果
5.georadius 以某个经纬度的位置为中心,划一个指定距离的半径,返回集合中满足条件的地址 附近的xxx的一种实现方式
georadius + key +中心的精度 +中心的纬度 + 半径的距离+ 半径的单位
可选参数 withdist 返回距离; withcoord 返回经纬度;withhash 返回hash编码

Redis数据结构七 BitMap

BitMap就是一个byter数组,元素中每一个bit位用来表示元素在当前节点对应的状态,实际上底层也是通过对字符串的操作来实现,对应开发中boolen类型数据的存取

原理

位数组是自动扩展的,可以直接的都字符串的ascii码,是为整存零取,也可以零存零取或零存整取。如果对应的字节是不可打印字符,会显示该字符的十六进制。

命令

基础操作:setbit key offset value
(offset 必须是数字,代表数组下标,value 只能是0 或者1,代表布尔型)
CRUD操作:setbit/getbit
统计和查找操作:bitcount/bitpos
批量操作:bitfield(三个子指令 get set incrby)

使用

1.读取操作
1.setbit key index 0/1
2.getbit key index 获取某个位置的值
3.get key 零存整取,直接获得二进制字符数组对应的字符串
2.统计操作
1.bitcount 查询数组中有多少个1
支持参数 字符的起始位置到

Redis数据结构八 HyperLogLog(技术统计)

Redis的基数统计,这个结构可以非常省内存的去统计各种技术。他是一个基于基数估算的算法,但并不绝对准确,标准误差是0.81%。HyperLogLog数据结构的发明人是Philippe Flajolet,pf是名字首字母缩写

原理

HyperLogLog最大栈用12kb的存储空间。当计数比较小是,使用系数矩阵存储,栈用空间很小,在变大到超过阈值时,会变成稠密矩阵,栈用12kb
算法:给定一系列的随机整数,记录地位连续0位的最大长度k,通过看可以估算出随机数的数量N

命令

计数操作:pfadd、pfcount
累加操作:pfmerge+ destkey sourcekey[sourcekey……]

使用

1.基础命令
pfadd 增加数据
pfcount 统计数据(去重)

Redis数据结构九 Stream

Stream是redis5.0引入的一种新数据类型,允许消费者等待生产者发送的新数据,还引入消费者组概念,组之间数据是相同的(前提是设置的偏移量一样),组内的消费者不会拿到相同的数据。这种概念和kafka很雷同

原理

与redis的pub/sub不同,pub/sub多个客户端时收到相同的数据,而Stream的多个客户端时竞争关系,每个客户端收到的数据时不相同的

命令

基础操作:xadd/xread
范围操作:xrange/xrevrange
消费者操作:xgroup/xack

使用

1.消息的发布与订阅
subscribe + channel 订阅频道的命令,会持续接收消息
publish + channel + message 在某个频道发布信息,相应的订阅者会接受到
2.Stream命令
生成消息的命令
1.xadd生成消息。返回消息ID(时间戳+顺序),顺序指的是该毫秒下产生的第几条消息
2.xlen查看消息列表的长度
3.xrange key -+ 遍历所有消息
4.xdel key + 消息ID 通过消息id删除消息
读取消息的命令
xread 读取消息,返回消息列表
xread + streams + key +0-0 遍历读取所有的消息
支持参数 count +number 指定返回消息的数量
支持参数block +num ,可以阻塞等待消息的返回,此时0-0 应该替换为“$”,代表从尾部接收

发布订阅 pub/sub

进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息

命令

1.PSUBSCRIBE pattem[pattem……]:订阅一个或多个符合给定模式的频道
2.PUBSUB subcommand [argument[argument……]]:查看订阅于发布系统的状态
3.PUBLISH channel message:将信息发送到指定的频道
4.PUNSUBSCRIBE [pattem[pattem……]]:推定所有给定模式的频道
5.SUBSCRIBE channel[channel……]:订阅给定的一个或多个频道的信息
6.UNSUBSCRIBE[channel[channel……]]:指退订给定的频道
发布订阅设计模式

Redis基础笔记(下)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值