Redis基本概念

本文介绍了Redis,一个基于内存的高性能键值存储系统,及其在缓存、排行榜、计数器、社交网络功能实现、最新列表管理和地理位置数据等方面的应用。重点讨论了Redis的快速性,包括内存存储、单线程设计和非阻塞IO技术。
摘要由CSDN通过智能技术生成

什么是Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis的用处

缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

排行榜

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

社交网络

点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。如在微博中的共同好友,通过Redis的set能够很方便得出。

最新列表

Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。

地图数据

Redis支持地理位置数据的存储和查询,通过使用Redis的地理位置数据类型(Geo),你可以将地理坐标(经纬度)与其他数据关联起来。例如,你可以将商店的位置坐标存储在Redis中,并使用Geo命令在地理范围内查询附近的商店。Redis提供了计算两个地理位置之间距离的命令。你可以使用这些命令计算两个坐标之间的距离,进而进行地图分析和路径规划。

Redis为什么这么快

  • 内存存储:Redis是使用内存(in-memeroy)存储,没有磁盘IO上的开销。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1)。
  • 单线程实现:( Redis 6.0以前):Redis使用单个线程处理请求,避免了多个线程之间线程切换和锁资源争用的开销。注意:单线程是指的是在核心网络模型中,网络请求模块使用一个线程来处理,即一个线程处理所有网络请求。
  • 非阻塞IO:Redis使用多路复用IO技术,将epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
  • 优化的数据结构:Redis有诸多可以直接应用的优化数据结构的实现,应用层可以直接使用原生的数据结构提升性能。
  • 使用底层模型不同:Redis直接自己构建了 VM (虚拟内存)机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

为什么Redis单线程还是快

  • redis是内存型数据库
  • redis特殊的数据结构
  • 单线程避免锁的竞争
  • io多路复用
  • 单线程没有上下文的切换

Redis基本概念

数据库大小

Redis有16个数据库,默认情况下对数据库0进行操作。

在Redis中,每个数据库的默认大小是由系统内存的限制决定的,而不是有一个固定的默认大小。默认情况下,Redis会尽可能使用所有可用的系统内存。

我们可以通过maxmemory这个参数用于设置Redis服务器可以使用的最大内存量。可以在Redis配置文件(redis.conf)中设置它,或者在启动Redis服务器时通过命令行选项进行设置。

例如,设置总内存限制为1GB:maxmemory 1gb。

切换数据库

在应用程序中,选择要操作的数据库(0到15之间的数据库编号),并使用Redis的SELECT命令切换到相应的数据库。并可以使用DBSIZE来查看当前数据库的大小。

Redis数据类型

RedisKey基本命令

keys *查看当前数据库的所有key
set  key添加一个key
get key获取key
type key查看key的类型
EXISTS key查询是否存在key
move key移除key
EXPIRE key 100设置过期时间为100秒
ttl key查看剩余过期时间
flushdb清空当前数据库
flushall清空所有数据库

五种基本数据类型

String

String是最常用的一种数据类型,普通的key- value 存储都可以归为此类。其中Value既可以是数字也可以是字符串。使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。

append key "test"为key追加一个test字符串
strlen key获取key的长度
incr keykey的值加一
decr keykey的值减一
incrby key nkey的值加n
decrby key nkey的值减n
GETRANGE key start end截取key的一部分
SETRANGE key n xxx从n开始替换key为xxx
mset k1 v1 k2 v2 k3 v3批量添加key

List

List是一个有序可重复的集合,其遵循FIFO的原则,底层是依赖双向链表实现的,因此支持正向、反向双重查找。通过List,我们可以很方面的获得类似于最新回复这类的功能实现。

LPUSH list demo创建list并在头部(左)放入demo
LRANGE list 0 -1查询list所有元素
LRANGE list 0 1查询list索引0-1的元素
RPUSH list demo2在list并在尾部(右)放入demo
LPOP list删除头部元素
RPOP list删除尾部元素
LINDEX n获取索引为n的元素
LLEN list获取list的长度
LREM list n key移除list中的n个key
LTRIM list start end从start开始到end结束来截取list
LINSERT list a BEFORE/AFTER value从投开始在找到的第一个a前/后添加一个value

Set

Set是一个无序的天然去重的集合,即Key-Set。此外还提供了交集、并集等一系列直接操作集合的方法,对于求共同好友、共同关注什么的功能。

sadd myset hello向set中添加元素
SMEMBERS myset查看myset所有值
SISMEMBER myset hello判断某一个值是否在myset中
scard myset获取集合中元素的个数
SRANDMEMBER myset n从set中随机获取n个元素

具体的功能实现

差集

SDIFF set1 set2

可以用于计算set1集合中有而set2集合中没有的东西。

并集

SUNION set1 set2

可以用于计算set1和set2中的所有不重复元素

交集

SINTER set1 set2

查看两个集合的相交元素,用于查找两个用户的共同好友或者共同关注的实现。

Hash

哈希类型中的 映射关系 叫作 field-value,这里的 value 是指 field 对应的 ,不是  对应的值。可以大致理解为key - map 集合。本质上和string没有什么区别。相较于string来说,hash更适合来进行对象的存储。

hset myhash field1 gao设置一个具体的filed value
hget myhash field1获取一个具体的value
hmset myhash field1 value1 field2 value2设置多个field value
hmget myhash  field1 field2 获取多个field的value
hgetall myhash获取全部的值
hdel myhash field删除指定的field value
hlen myhash获取hash的field-value数量
hexists mhash field1 判断是否存在,返回0 1
hkeys myhash获取全部field
hvals myhash获取全部value

Zset 

类似于java中的TreeSet,是Set的可排序版。此外还支持优先级排序,维护了一个score的参数来实现。适用于排行榜和带权重的消息队列等场景。

zadd score 98 a为score集合添加a,值为98
zrangebyscore score min max从min到max进行从小到大的排序
zrangebyscore score min max withscores从min到max进行从小到大的排序并输出score

zreverange max min

从max到min进行从大到小的排序
zcard score获取score的元素个数

跳跃表 

跳跃表(SkipList)是用于有序元素序列快速搜索查找的一个数据结构,跳表是一个随机化的数据结构,实质是通过一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引实现快速查找。调表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。它在性能上和红黑树,avl树不相上下,但跳表原理十分简单。

三种特殊数据类型

Geospatial

主要用于存储地理位置信息,并对存储的信息进行操作,适用场景如朋友的定位、附近的人、打车距离计算等。

geoadd china:city 116.40 39.90 beijing添加北京的经纬度
geodist china:city beijing shanghai km计算北京和上海的直线距离单位为km
geopos china:city beijing获取北京的经纬度坐标
georadius china:city 110 30 1000 km查询这个坐标1000km范围内的元素
georadius china:city 110 30 1000 km withdist查询这个坐标1000km范围内的元素并显示具体距离
georadiusbymember china:city beijing 1000km查询距离北京1000km内的元素

Hyperlog

HyperLogLog 是一种用于统计基数的数据集合类型,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。场景:统计网页的UV(即Unique Visitor,不重复访客,一个人访问某个网站多次,但是还是只计算为一次)。统计时大概有0.81%的误差,是完全可以忽略不计的。

基数
比如数据集{ 1,3,5,7,5,7,9} ,那么这个数据集的基数集则为{1,3,5,7,9},基数(不重复元素)为5(个)

如果允许有误差--网页访问量       使用hyperlog

如果不允许有误差--共同好友       使用set

pfadd mykey q w e r新增一个数据集
pfcount mykey求数据集的数据量
pfmerge mykey3 mykey1 mykey2合并mykey1 mykey2到mykey3中

Bitmap

Bitmap想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在Bitmap中叫做偏移量。使用Bitmap实现统计功能,更省空间。如果只需要统计数据的二值状态,例如商品有没有、用户在不在等,就可以使用 Bitmap,因为它只用一个 bit 位就能表示 0 或 1。

打卡案例

setbit sign 0 1设置周一打卡
getbit sign 0获取周一打卡情况
bitcount sign统计这周打卡情况,可以指定时间段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值