轻松搞定高并发:详解Redis的五种数据类型及应用场景分析!

技术分享  / 只看大图  / 倒序浏览   ©

#楼主# 2020-4-8

跳转到指定楼层

马上注册,分享更多源码,享用更多功能,让你轻松玩转云大陆。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一、Redis根本概念介绍和特性


  • 1.1 Redis根本概念介绍
075501vd77c4942d4zp6y4.png
1.Redis是远程的,有客户端和服务端,我们一般说的是服务端;
2.Redis是基于内存的,所以比基于硬盘的MySQL要快许多,但非常吃内存
3.Redis是非关系型数据库。本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不需要。


  • 1.2 Redis 和 Memcached比较
075502euf311qfp44db84r.png
Redis数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
与Memcached一样,为了保证服从,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  • 1.3 Redis支持主从同步
数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可实行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
二、Redis的应用场景


  • 2.1 缓存
075502c602x2qfmck0omyx.png
Redis常常作为数据缓存
当某些体系接口比较慢的时候,我们可以把一些数据放在Redis中缓存起来,下次取数据就不进行非常耗时的SQL操作了,直接从缓存中取数据,提升体系性能最常用的方法之一;

  • 2.2 队列
push和pop操作保证了原子性的实现;

  • 2.3 数据存储
所有的增删改查都是在Redis中进行,Redis有硬盘的持久化机制,定期进行存储,保证了数据的完整性和安全性。
查看redis客户端: which redis-cli
登录:redis-cli(默认登录本机6379端口)
info命令查看redis信息
三、Redis数据类型

在redis里边,除了\n和空格 不能作为名字的构成内容外,其他内容都可以作为key的名字部分。名字长度不做要求。
*exists key          #测试指定key是否存在del key1 key2 key3  #删除给定的key*type key            #返回给定的value的类型keys pattern        #返回匹配指定模式的所有keyrename oldkey newkey#改名字*dbsize              #返回当前数据库的key数量expire key seconds  #为key指定过期时间*ttl key             #返回key的剩余过期秒数*select db-index     #选择数据库,一共16个move key db-index   #将key从当前数据库移动到指定命据库*flushdb             #删除当前数据库中所有keyflushall            #删除所有数据库中的所有key
075502nwmbo2ii8vmkq89o.png


  • 3.1 String字符串类型的操作
075503k1ygjvkvr080gjl1.png
功能:提供字符串或者整型操作。
set key value(string/int/float)get keyincr string  [value]//自增decrby string [value] //自减
string是redis最根本的类型
redis的string可以包含任何数据。包括jpg图片(二进制)或者序列化的对象。
单个value值最大上限是1G字节。
假如只用string类型,redis就可以被看作加上持久化特性的memcache。
set key value                   #设置key对应的值为string类型的value*mset key1 value1 key2 value2    #一次设置多个key的值*mget key1 key2                  #一次获取多个key的值*incr key                        #对key的值做加加操作,并返回新的值decr key                        #对key的值做渐减操作,并返回新的值incrby key integer              #同incr,加指定的值decrby key integer              #同decr,减指定的值*append key value                #给指定key的字符串值追加value*substr key start end            #返回截取过的key的字符串值

  • 3.2 List链表类型
075503ny8i8wfyy1q8aqfo.png
功能:存储序列集合,可用于队列,push和pop操作
lpush 左进rpop 右出llen key  查看list有几个元素List类型是先辈先出,适合队列;List不要求内里的元素是唯一的
(一)介绍
获得最新的10个登录用户信息: select * from user order by logintime desc limit 10;
以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响,对数据库的负载比较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较泯灭体系资源。
假如通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗
(二)应用
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。
这使得list既可以用作栈,也可以用作队列。
上进上出 :栈
上进下出 :队列
075503zuy1udd7noxxezdx.png
lpush key string    #在key对应list的头部添加字符串元素rpop key            #在list的尾部删除元素,并返回删除元素llen key 返回key      #对应list的长度,key不存在返回0,假如key对应类型不是list返回错误lrange key start end  #返回指定区间内的元素,下标从0开始rpush key string        #同上,在尾部添加lpop key            #从list的头部删除元素,并返回删除元素ltrim key start end  #截取list,保留指定区间内元素1.lrange key 0 -1 取出所有元素。
2.lrem key n/-n X 删除指定元素n次。
3.linsert key after/before key1 key2 在key1后/前插入key2。
4.rpoplpush key1 key2 将key1右边key左入key2链表,原子性
的操作利用
075504he3wvv3u1skzwkv3.png
功能:无序集合,每个元素都不一样
添加元素:sadd key value判断有多少个元素:scard key判断某个元素是否在set内里:sismember key value删除某个元素:srem key value获取全部值,并以数组方式返回:$redis->sMembers('dst'));int(2)array(2) {  [0]=>  string(1) "4"  [1]=>  string(1) "2"}

  • 3.3 Set类型
set类型,无序的方式存储多个不同的元素,对元素可以进行快速的添加、查找和删除;相同的元素只算一个
redis的set是string类型的无序集合。
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了根本的添加删除操作,
其他有用的操作还包含集合的取并集(union),交集(intersection), 差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能
注意:每个集合中的各个元素不能重复。
sadd key member             #添加一个string元素到key对应的set集合中,乐成返回1,假如元素已经在集合中,返回0,key对应的set不存在返回错误srem key member [memeber]    #从key对应set中移除给定元素,乐成返回1smove p1 p2 member          #从p1 对应set中移除member并添加到p2对应set中scard key                   #返回set的元素个数sismember key member        #判断member是否在set中sinter key1 key2...keyn     #返回所有给定key的交集sunion key1 key2...keyn      #返回所有给定key的并集sdiff key1 key2...keyn      #返回所有给定key的差集smembers key                #返回key对应set的所有元素,结果是无序的该类型应用场所:qq好友推荐。
tom朋友圈(与某某是好友):mary jack xiaoming wang5 wang6 linken朋友圈(与某某是好友):yuehan daxiong luce wang5 wang6
075504coc3g47573g3cz4c.png


  • 3.4 hash类型
075504j6zmf6imhh6fmf2h.png
功能:存储的是key-value布局,key必须是string
常常用于存储比较复杂的布局,Hash只要求键不一样,好比姓名,年龄等等
插入/修改:hset hash1 key1 12获取:hget hash1 key1查看hash长度:hlen key一次性获取:hmget hash1 key1 key2
075505xpvzv3z2o1lzo2bm.png
075505nitvb8uu5xb22tuu.png


  • 3.5 Sort Set排序集合类型
075505afi17w8xwvsrov1w.png
功能:存储是带分数的有序集合,常常用于排行榜
sort set 常常被用作排名例如 班级结果排名
存储和hash一样,都是一个映射。存储的是分数与元素的映射。可以看出是排行榜。
value必须是全局唯一。
score 是浮点型。
sort set类型操作,假如两个元素的score一样,按照字节次序排列先后
增长/修改:zadd zset1 10.1 val1查看个数:zcard zset1查看排名:zrange zset1 0 2 withscores查看某个value排名:zrank zset1 val2
和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个。 通过权值可以有序的获取集合中的元素。
该Sort set类型适合场所:
获得热门帖子(复兴量)信息:select * from message order by backnum desc limit 5;
(以上需求可以通过简单sql语句实现,但是sql语句比较泯灭mysql数据库资源)
案例:利用sort set实现获取最热门的前5帖子信息
075505ofjfrhsyf4yf1wos.png
排序集合中的每个元素都是值、权的组合 (之前的set集合类型每个元素就只是一个 值)
075506bonr77878f78gyyy.png
我们只做一个sort set排序集合,里边只保留5个元素信息,该5个元素是复兴量最高的
每个帖子被复兴的时候,都有时机进入该集合里边,但是只有复兴量最高的前5个帖子会存在于在集合,复兴量低的就被删除。
127.0.0.1:6379> select 2OK127.0.0.1:6379[2]> zadd hotmessage 102 11  //添加(integer) 1127.0.0.1:6379[2]> zadd hotmessage 141 12(integer) 1127.0.0.1:6379[2]> zadd hotmessage 159 13(integer) 1127.0.0.1:6379[2]> zadd hotmessage 72 14(integer) 1127.0.0.1:6379[2]> zadd hotmessage 203 15(integer) 1127.0.0.1:6379[2]> keys *1) "hotmessage"127.0.0.1:6379[2]> zrevrange hotmessage 0 100//按照权由高到低的次序获得具体元素值的信息1) "15"2) "13"3) "12"4) "11"5) "14"127.0.0.1:6379[2]> zadd hotmessage 189 16(integer) 1127.0.0.1:6379[2]> zrevrange hotmessage 0 1001) "15"2) "16"3) "13"4) "12"5) "11"6) "14"127.0.0.1:6379[2]> zremrangebyrank hotmessage 0 0(integer) 1//把权最低的那个删掉 0 0表示删除第一个权;0 1表示删除第一个,第二个权;127.0.0.1:6379[2]> zrevrange hotmessage 0 1001) "15"2) "16"3) "13"4) "12"5) "11"127.0.0.1:6379[2]> zrank hotmessage 12//权由低到高获得元素排名(integer) 1127.0.0.1:6379[2]> zrank hotmessage 11(integer) 0127.0.0.1:6379[2]> zrevrank hotmessage 13//权由高到低获得元素排名(integer) 2127.0.0.1:6379[2]> zcard hotmessage//获得集合中元素个数(integer) 5127.0.0.1:6379[2]> zscore hotmessage 16//根据元素值获得对应的权"189"127.0.0.1:6379[2]> zincrby hotmessage 100 12//给指定的元素值增长一些权信息"241"127.0.0.1:6379[2]> zrevrange hotmessage 0 1001) "12"2) "15"3) "16"4) "13"5) "11"127.0.0.1:6379[2]> 共同学习,资料分享

本文深入浅出的介绍了Redis的五种数据类型,并通过多个实用示例展示了Redis的用法。除此之外还讲述了Redis的优化方法和扩展方法。
一共由三个部分构成;
第一部分对Redis进行了介绍,说明了Redis的根本利用方法、它拥有的5种数据布局以及操作5种数据布局的命令,并详解了如何利用Redis去构建文章聚合网站、cookie、购物车、网页缓存。数据库行缓存等一系列程序。
第二部分对Redis命令进行了更详细的介绍,并展示了如何利用Redis去构建更为复杂的辅助工具和应用程序,并在最后展示了如何利用Redis去构建一个简单的社交网站。
第三部分对Redis用户会常常遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及利用Lua语言进行脚本编程的方法。
本书既覆盖了命令用法等入门主题,也包含了复制、集群、性能扩展等深入主题,所以无论是Redis新手还是对Redis有肯定履历的利用者,应该都能从书中获益。
假如需要获取到这个【Redis实战文档】文档的可以点这里免费获取!(内容细节比较多,所以把知识点粗略的截图出来了)
一、Redis入门介绍

1.1:初认redis

  • redis简介(redis与其他数据库和原价对比,附加特性,利用redis的理由)
  • redis数据布局简介(redis字符串,redis列表,redis集合,redis散列,redis有序集合)
075506vxh73vkvg6v56xzv.png
1.2:利用Redis构建Web应用

  • 登录和cookie缓存
  • 利用Redis实现购物车
  • 网页缓存
  • 数据行缓存
  • 网页分析
075507ph6d8hh6qizhchhh.png
二、Redis核心概念

2.1:redis命令

  • 字符串
  • 列表
  • 集合
  • 散列
  • 有序集合
  • 发布与订阅
  • 其他命令(排序,根本的redis事务,键的过期时间)
075508bln2h8ypnj8hjnnw.png
2.2:数据安全与性能保障

  • 持久化选项
  • 复制
  • 处理体系故障
  • Redis事务
  • 非事务型流水线
  • 关于性能方面的注意事项
075509eer6n11nww3167n3.png
2.3:利用redis的构建支持程序

  • 利用redis来记录日志
  • 计数器和统计数据
  • 查找IP所属城市及国家
  • 服务的发展与配置
075510bakvvo9b1y292eoy.png
2.4:利用redis构建应用程序组件

  • 自动补全
  • 分布式锁
  • 计数信号量
  • 任务队列
  • 消息拉取
  • 利用redis进行文件分发
075511gzx05ssxye3b63cx.png
2.5:基于搜刮的应用程序

  • 利用redis进行搜刮
  • 有序索引
  • 广告定向
  • 职位搜刮
075512fwhq9l3qo3ruagof.png
2.6:构建简单的社交网站

  • 用户和状态
  • 主页时间线
  • 关注者列表和正在关注列表
  • 状态消息的发布与删除
  • 流API
075514d4nwk0j0swhsmswh.png
三、Redis进阶详解

3.1:降低内存占用

  • 短布局
  • 分片布局
  • 打包存储二进制位和字节
075515bhzg4x221nd4vkd8.png
3.2:扩展redis

  • 扩展读性能
  • 扩展写性能和内存容量
  • 扩展复杂的查询
075516nymqveutyyq18um4.png
3.3:redis的Lua 脚本编程

  • 在不编写 C代码的情况下添加新功能
  • 利用Lua重写锁和信号量
  • 移除WATCH/MULTI/EXEC事务
  • 利用Lua对列表进行分片
075517uyo2f8j4of588xiq.png
最后

假如需要获取到这个【Redis实战文档】文档的可以点这里免费获取!(内容细节比较多,所以把知识点粗略的截图出来了)
最后祝各人工作顺遂,升职加薪,口试都能通过,offer拿到手软,早日找到心仪的工作~
075518mpqoag6xqhooayy4.png
分享淘帖
回复

使用道具

您的回复是对作者最大的奖励

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

13385506827

新手猿

  • 主题

    10

  • 帖子

    10

  • 关注者

    0

Archiver|手机版|小黑屋|云大陆 | 赣ICP备18008958号-4|网站地图
Powered by vrarz.com!  © 2019-2020版权所有云大陆