Redis(1)- 认识Redis

一、前言

很多开源项目中都使用了redis,这些项目为什么使用redis?使用redis有什么好处?怎么使用redis?带着这些疑问,我们来了解一下redis。

二、什么是Redis

Redis是一个免费开源用于内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。它支持多种集群部署,辅助项目达到更高的性能。

三、Redis的数据结构

Redis 数据结构类型分为:字符串、哈希、列表、集合、有序集合等五种类型。
Redis(1)- 认识Redis_第1张图片

1.String 字符串类型

介绍

是redis中最基本的数据类型,一个key对应一个value。

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

使用:get 、 set 、 del 、 incr、 decr 等

set key value : 新增或更新字符串键值对

mset key value [key1 value1 ...]:批量新增或更新键值对

setnx key value :如果key不存在就添加,否则就失败

setex key seconds value:设置简直对的时同时设置过期时间

get key :获取指定key的值

mget key [key1 key2 ...]:获取多个key的值

del key [key1 key2 ...]:删除指定key

expire key seconds:设置指定key过期时间,以秒为单位

ttl key:查看指定key还剩余多长时间

incr key:将指定key存储的数值加1

decr key:将指定key存储的数值减1

incrby key step:将指定key存储的数值加上step

decrby key step :将指定key存储的数值减去step

实战场景:

(1)缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。

(2)计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。

(3)session:常见方案spring session + redis实现session共享,

(4)分布式锁:单体程序,多线程通过线程锁来控制资源抢占,对于分布式系统就用线程锁就不行了,借助于 setnx (set if not exists的缩写)来完成,及如果没有值就能新增成功,否则就失败,和资源被占就要等待原理是一样的,当然还得考虑对应值的过期和删除,不然一直占用也不行。

2.Hash (哈希)

介绍

是一个Mapmap,指值本身又是一种键值对结构,如 value={{field1,value1},…fieldN,valueN}}
Redis(1)- 认识Redis_第2张图片
使用:所有hash的命令都是 h 开头的 hget 、hset 、 hdel 等

hset key field value : 新增或更新key对应字段的值;

hsetnx key field value:新增一个不存在Key的字段值;

hmset key field value [field value ...]:在指定Key上存储多个字段和值

hget key field:获取指定key中指定字段的值;

hdel key field [field1...]:删除指定Key值的指定字段

hlen key:获取指定key中的字段的数量

hgetall key:获取指定key中所有的字段值

hincrby key field step:指定key中字段值增加step

实战场景:

(1)缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。

(2)做购物车:因为大型的网站,用户很多,将每个人的购物车信息都进行关系存储,做以下页面是有点难处的。所以用Redis做比较高效,至于一些明细信息,可以通过商品ID从关系数据库中查找。
操作实例如下:

127.0.0.1:6379> hset car:userId:1 goodId:100 1 #用户-1添加1件商品-100 
(integer) 1
127.0.0.1:6379> hset car:userId:1 goodId:200 3 #用户-1 添加 3件 商品-200
(integer) 1
127.0.0.1:6379> hgetall car:userId:1 # 列出用户-1的购物车
1) "goodId:100"
2) "1"
3) "goodId:200"
4) "3"
127.0.0.1:6379> HINCRBY car:userId:1 goodId:200 2 #用户-1 增加 2件 商品-200
(integer) 5
127.0.0.1:6379> HINCRBY car:userId:1 goodId:100 -1 #用户-1 减少 1件 商品-200
(integer) 0

3.链表

介绍

List 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。

Redis(1)- 认识Redis_第3张图片
使用:

lpush key value [value1 ...] :在指定key的列表左边插入一个或多个值;

rpush key value [value1 ...] :在指定key的列表右边插入一个或多个值;

lpop key :从指定key的列表左边取出第一个值;

rpop key:从指定key的列表右边取出第一个值;

lrange key start end:从指定key列表中获取指定区间内的数据;

blpop key [key1 ...] timeout:从指定key列表中左边取出第一个值,若列表中没有元素就等待timeout时间,如果timeout为0就一直等待。

brpop key [key1 ...] timeout: 从指定key列表中右边取出第一个值,若列表中没有元素就等待timeout时间,如果timeout为0就一直等待。

lset key index value:将指定下标的值更新为value,

实战场景:

(1)timeline:(lpush+lrange)例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
(2)数据结构:
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop | rpush+blpop =Message Queue(消息队列)

4.Set 集合

介绍

集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。
Redis(1)- 认识Redis_第4张图片
使用:命令都是以s开头的 sset 、srem、scard、smembers、sismember

sadd key member [member ...]:在集合中增加一个或多个元素;

srem key member [member ...]:从集合中删除一个或多个元素;

smembers key:获取集合中的所欲元素;

scard key:获取集合中的元素个数;

sismember key member:判断指定member是否在集合中;

srandmember key [count]:从集合中获取count个元素,不从集合中删除;

spop key [count]:从集合中获取count个元素,从集合中删除

sinter key [key1 ...]:指定多个集合进行交集运算;

sinterstore dest key [key1 ...]:指定多个集合进行交集运算,存入dest集合;

sunion key [key1 ...]:指定多个集合进行并集运算;

sunionstore dest key [key1 ...]:指定多个集合进行并集运算,存入dest集合;

sdiff key [key1 ...]:指定多个集合进行差集运算;

sdiffstore dest key [key1 ...]:指定多个集合进行差集运算,并存入dest集合;

实战场景;

(1)标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。

(2)点赞,或点踩,收藏等,可以放到set中实现

(3)抽奖逻辑:抽奖小伙伴们不陌生了吧,不管是公司年会抽奖,还是公众号参与抽奖,应该几乎不用亲手抓阄了吧。都是通过程序,把人员都放在一起,然后随机抽取,set很符合这种应用场景
命令演示:

sadd luckDraw user1 # 用户参与抽奖
smembers luckDraw # 查看参与抽奖人

srandmember luckDraw # 随机抽取一人不剔除(可重复抽)
srandmember luckDraw 2 # 随机抽取2人不剔除(可重复抽)

spop luckDraw #随机抽取一人并删除(不可重复抽)
spop luckDraw 2 #随机抽取2人并删除(不可重复抽)

5.zset 有序集合

介绍

有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。

(有序集合中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)。
Redis(1)- 认识Redis_第5张图片
使用: 有序集合的命令都是 以 z 开头 zadd 、 zrange、 zscore

zadd key score member [(score member)...]:往有序集合中添加带分值的元素;

zrem key member [member...]:从有序集合中删除成员;

zscore key member:返回集合中指定成员的分值;

zcard key:统计集合中元素个数;

zrange key start stop [withscores]:返回指定范围的元素,withscores代表返回的元素包含对应的分值。

zreverange key start stop [withscores]:返回指定范围的倒序元素, withscores代表返回的元素包含对应的分值。

同set一样也可以进行交集、并集、差集的集合运算。

实战场景:

(1)排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

四、安装部署

1.前言

redis官网提供安装包和安装的步骤点击查看。

这里演示下源代码安装。

1.redis下载

提取和编译redis

wget https://download.redis.io/releases/redis-6.2.2.tar.gz
tar xzf redis-6.2.2.tar.gz
cd redis-6.2.2
make

src 目录 中现在提供了已编译的二进制文件 ,运行redis,可指定配置运行

src/redis-server  redis.conf

使用内置客户端与Redis进行交互:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

你可能感兴趣的:(Redis,redis,数据结构,数据库)