redis烂大街知识点

Jankin的redis基础知识讲解


redis概述

redis是一种可以用来存储非结构化数据的内存数据库,也是键值类型nosql中最流行的其中一种。其极高的性能优势、丰富的数据类型、支持网络传输以及事务、持久化、集群均是redis备受喜爱的原因。redis除了可以做缓存之外,还可以用来做数据库、消息队列等等操作,而这些也是因其强大的功能特性所支撑而支持。

nosql的慨念

nosql 是not only sql ,直译为“不仅仅是sql”,其出现的目的是为了解决当今基数庞大且非结构化数据集与结构化数据库之间的矛盾。

我们知道,数据库的出现就是为了保存、操作我们软件中产生的数据,而数据也是软件价值的具现之一。而然而,随着业务的不断迭代、用户数量以及操作的不断丰富以及频繁化,软件每天产生的数据来源的不断丰富,传统的结构化数据库已经不能很好的提供服务的支持了,例如(mysql虽然使用了B+tree的数据结构,理论上能保证6、7百万数据集的查询的性能,但是实际上,mysql数据库达到3百万的并发数已经开始“力不从心”),而且像非文本类型数据的大量累积,传统的数据库已经无法提供很好的存储服务。所以为了减小数据库的压力,nosql开始蓬勃发展。

常见的nosql数据库种类

1、键值类型(key-value——代表 : redis、memacache

2、文档类型——代表产品:mongodb

3、列式类型——代表产品:Hbase

4、图像类型——代表产品:Neoj4

redis的五种基础数据类型

1、字符串类型(最常用,为此springboot-data-redis还给其特定了一个StringRedisTemplate)

2、list(列表,其内的结构可以想象成链表)

3、set(不重复的数据集,类比java中的set collection)

4、hash(哈希类型,类比java中的map)

5、zset(也是集合,但有序且不重复的,主要用于排序)

redis三大特殊类型

1、地图范围:geo;主要用于操作经纬度地理位置,例如两点间的距离,或者根据某点进行半径范围查找。(可以用于实现”附近的人“等功能业务)

2、hyperloglog(处理数据基数),当我们无需知道数据集内数据具体的值,而是需要面向整个数据据进行操作时,例如统计基数的等等,那么可以使用该类型,该类型使用了特定的算法,且占用的内存少,但是精度较低,若需要进行精确的统计,可以使用redis第三种特殊的数据类型bitmap

3、bitmap(位存储类型),二进制的数是由0与1进行描述的,而二进制的为一位均为1bit,所以我们可以将二进制的每一bit作为一个标志,这样我们就能用少量的存储计算大量数据集的精确的基数。

例如,打卡操作,如果需要记录一个星期员工的打卡记录,我们可以为每一个员工准备7个bit位的二进制数据,若星期一打卡了,则将第1位的bit位置为1如此进行之后的打卡操作,到时,我们要统计该用户在该星期的打卡天数,只需要统计这7个bit位中有多少位1即可,这是不是内存消耗少且精确的基数统计方式?

redis的操作命令(原生)
redis中操作数据库的命令
#redis提供了16个数据库,默认使用的是第0号数据库
#选择其他数据库
select 数据库编号

#查找当前数据库下的所有key-value
keys *

#初始化(清空)当前数据库的所有kv
fluashdb

#清空所有数据库的所有kv
fluashall

#随机获取一个当前数据库存在的kv对中的key
randomkey

#删除指定的kv对
del keyName

#为kv对中的key重命名(俩命令)
#这个方法会有一个现象,即当数据库中存在newKeyName的键名时,原kv会被替换(包括value)
rename oldKeyName newKeyName
#此方法重命名则不会出现上述现象,即只有当数据库中不存在该newKeyName时才会进行重命名
renamenx oldKeyName newKeyName

#注意:在redis中,命令结尾为nx,都表示不存在进行操作;而还有一个就是以en结尾的表示,设置并进行定时操作

#判断一个key是否存在在数据库,不存在返回0
exists keyName

#将一个kv对转移到另一个数据库
move keyName dbNum

#设置一个key的超时时间(单位秒)
expire key seconds

#查看当前key所剩时间(但key存在但是永久存在,则返回-1,若key已经不存在或从没有存在过返回-2,其余返回剩余时间)
ttl keyName


String 类型kv操作命令
命令
#添加(修改即覆盖)
set key value 
#添加多个
mset key1 value1 key2 value2...

#注意在redis中命令前加m表示many,

#获取某key的value
get key
#获取keys(多个key)的value
mget key1 key2 ...

#在字符串中追加子串
#若key不存在,则创建key = appendValue
append key appendValue

#获取value字符串指定下标范围的子串 ,该查询是闭区间的【】
getrange keyName start end

#获取并修改key值(获取原先的值,之后设置新的值)
getset key newValue

#获取value字符串长度(若keyName不存在返回0)
strlen keyName

#value也可以是整数类型,对于整数类型有加减一,加减n的操作
#加1
incr keyName
#减1
decr keyName
#加n
incrBy keyName num
#减n
decrBy keyName num

#创建一个新的kv并且设置定时
setex key 10 value

#从指定的offset处开始,覆盖value的长度
setrange keyName offset replaceValue

#对于key的命名,redis支持keyName中存在 : ,使用它可以用来存储对象的属性(标识 eg : user:123123:name  -- > user编号为123123的用户的name属性),用于提高名称的复用与可读性
主要用途

用于计数(粉丝数)用户登录数等等,存在incr/decr命令

用于存储字符串类型的对象(json等)

list(列表类型)

list我们可以将其想象成链表

命令
#添加一个元素(若key不存在,相当于创建一个并设置链表元素)
#在链表头插入一个元素
lpush list value 
#当然,也可以同时添加多个
lpush list v1 v2 v3 ...
#在链表尾部插入一个元素
rpush list v4
#也可以插入多个
rpush list v5 v6 ...

#获取指定范围角标的元素
lrange listKey start end

#获取列表下的所有元素 
lrange listKey 0 -1

#获取并移除链表头元素
lpop listKey 

#获取并删除链表尾元素
rpop listKey

#获取但不删除指定下标的元素
Lindex listKey indexNum

#查看链表长度
llen list

#移除指定value的元素
#num > 0 从列表头开始移除匹配的num个value
#num > 0 从列表尾开始移除匹配的num个value
#num = 0 从列表中移除所有的value
lrem list num value

#将列表中的指定下标的元素替换
#index >= 0 从列表头开始数
#index < 0 从列表尾开始数
lset list index newValue

#弹出列表尾的元素,放入到新的列表中
rpoplpush outputList inputList

#指定元素之后/之前插入(第一个匹配的元素)
linsert keyName before/after value insertValue

主要用途

可以充当栈、队列,用于消息队列的实现

set(集合类型)

元素不重复的集合

命令
#添加元素(若key不存在,则创建)
#若sey中存在元素,则不会添加
sadd key v1 v2 v3 v4

#获取所有的集合元素
smembers  setCollection  

#判断一个值是否是集合中的元素,是返回1,不是返回0
sismember setName value

#从集合中随机获取一个值
srandmember setColletion 

#随机移除一个元素
spop setCollection

#移除指定元素,一个至多个
srem setCollection v1 v2...

#将元素从一个集合移动到另一个集合中
smove outputSet inputSet value

#俩集合的操作
#交
sinter set1 set2
#差
sdiff set1 set2
#并
sunion set1 set2

#在交差并的命令后添加stoer ,将结果集存储第三个集合中
sinter newSet set1 set2

#获取集合元素数量
scard setCollection

主要用途

根据其不重复的特性,可以用来做粉丝列表、关注列表、以及共同关注、或你可能认识的人、因为其的无序性可以用来作为抽奖的奖池等等

Hash(哈希类型)

redis中的hash类型,将相当于java中的map类型,其value仍是键值对类型。

命令
#创建一个hash类型的值
hset keyName fieldKey fieldValue
#设置多个值
hmset keyName field1 v1 f2 v2 f3 v3..

#获取一个field
hset keyName fieldKey
#获取多个field值
hmget keyName field1 f2 f3 ...

#将其中一个field增减值
hincrby keyName fieldkey

#判断hash中是否存在指定域(存在,返回1,不存在返回0)
hexists keyName fieldkey

#当域不存在时添加域
hsetnx keyname field value

#获取hash中所有的kv
hgetAll keyName

#获取hash中指定域的值的长度
hstrlen keyName fieldKey

#获取hash所有的fieldname
hkeys keyname

#获取hash中所哟域的值
hvals keyName

#删除hash中的指定域
hdel keyname fieldName
主要用途

用于存储对象的数据

或者是用于存储登录用户的数据

zset(排序集合)

与set集合不同的是,zset给每一个元素增设的一个用于排序的score(分数或者说是权重),通过score将添加到zset中的的数据进行排序。

命令
#添加元素(要设置score)
zadd zsetCollection score v1 score v2 ...

#获取当前集合的元素个数
zcard zsetName

#返回分数范围内的元素数量(闭区间)
zcount key min max

#删除指定的元素
zrem key member

#给指定的元素分数减值
zincrby key +num menber  

#升序获取指定范围的元素(max = -1表示全部)
zrange key min max withscores

#降序获取指定元素(max = -1 表示获取全部)
zrevrange key min max withscores

#移除并且返回最小
zpopmin key
#移除并返回最大
zpopmax key

#确定指定元素在集合中的角标(排名,从零开始,从小到大)
zrank key member

#返回指定元素在集合中的排名(从大到小排)
zrevrank key member

#获取集合中元素的score
zscore key member
主要用途

因为其排序的特性,可以用来做网站的排行榜或者是成绩、工资等需排序的业务

geo(地图范围类型)
命令
#添加
geoadd key  经度  纬度  memberName

#获取指定元素的经纬度
geopos key membername1 m2 m3...

#两点间距离
geodist key mem1 mem2 m/km...

#指定点指定半径找元素
georadius key 经度 纬度 半径 单位(m/km/...)

#指定元素指定半径找其他元素
georadiusbymember key mem1 半径 单位
主要用途

找寻附近的人(资源)等操作

hyperloglog(基数的统计)
命令
#添加
pfadd  key v1 v2 v3...
#获取数量
pfcount key
#合并并保存 同git德合并分支merge操作
pfmerge newPF pf1 pf2
主要用途

用于无需数据集具体内容的基数统计,消耗内存小。

例如,网站的uv统计

bitmap(位统计)

也是用于统计的一种类型,是通过bit来标识的一种非无既有的统计

命令
#设置key的下标为n的bit位的值
setbit key n 1/0

#获取key中指定索引的bit值
getbit key index

#统计key中1的数量
bitcount key
主要用途

用于精确的统计数量,(使用hyperloglog的精确值只有百分之81),可以用来作为员工每天打卡的计数板等

redis事务

redis的事务与数据库的事务的概念有一些区别,redis的事务是不保证原子性的。依旧是说,即便事务中的某一条在执行时出错了,事务内的其他命令仍然执行。

事务的操作分为三步:

开启事务multi

编写命令,放入队列中

执行命令 exec 或者 放弃执行 discard

注意:事务开启后,每编写一条命令,该命令就会进入执行队列中,当遇到exec时才会一起执行。当出现编译时异常时,就算exec,也不会执行

bash
#设置key的下标为n的bit位的值
setbit key n 1/0

#获取key中指定索引的bit值
getbit key index

#统计key中1的数量
bitcount key


###### **主要用途**

用于精确的统计数量,(使用hyperloglog的精确值只有百分之81),可以用来作为员工每天打卡的计数板等





#### **redis事务**

> redis的事务与数据库的事务的概念有一些区别,redis的事务是不保证原子性的。依旧是说,即便事务中的某一条在执行时出错了,事务内的其他命令仍然执行。
>
> 事务的操作分为三步:
>
> 开启事务multi
>
> 编写命令,放入队列中
>
> 执行命令 exec 或者 放弃执行 discard



> 注意:事务开启后,每编写一条命令,该命令就会进入执行队列中,当遇到exec时才会一起执行。当出现编译时异常时,就算exec,也不会执行



为了实现redis的乐观锁,可以使用redis的watch命令检测数据的变化情况,当在事务开启之后被检测的的对象被修改则事务提交将会失败,且只要事务结束,watch将自动关闭,当然,也可以调用unwatch来手动关闭。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值