Redis工作原理与入门

Redis工作原理与入门

提示:由于是讲Redis的工作原理和入门,这里就不展示Redis的安装步骤了


前言

在redis机制类似的有款内存数据库缓存MemCache,由于它无法支持数据的持久化,于是Redis慢慢的登上了主舞台。

一、什么是Redis?它有什么特点?

1.什么是redis

Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。

2.Redis的特点

  1. 读写速度非常快
    Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。
  2. 可持久化
    Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。
  3. 支持主从模式
    Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。

二、Redis的五大基本数据结构

1.String

  1. String是redis最基本的类型,一个key对应一个value。
  2. String类型是二进制安全的,意味着Redis的String可以包含任何数据,比如jpg图片或者序列化的对象。
  3. String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

常用命令(示例):

1. set <key> <value>添加键值对

2. get<key>查询对应键值

3. append<key><value>将给定的<value>追加到原值的末尾

4. strlen<key>获得值的长度

5. setnx<key><value> 只有在key不存在时,设置key的值

6. incr<key>将key中储存的数字值增1,只能对数字值操作,如果为空,新增值为1

7. decr<key>将key中储存的数字值减1

8. incrby/decrby <key><步长>将key中储存的数字值增减,自定义步长

9. mset<key1><value1><key2><valae..... 同时设置一- 个或多个key-value对

10. mget<key1><key2><ke3>.... 同时获取一个或多 个value

11. msetnx<key1><value1><key2><valae...同时设置一 个或多 个key-value对,当且仅当所有给定key都不存在原子性,有-个失败则都失败

12. getrange <key><起始位置><结束位置>获得值的范围,类似java中的substring, 前包,后包 13. setrange <key><起始位置><value><value>覆写<key>所储存的字符串值,从<起始位置>开始(索引|从开始)

14. setex<key><过期时间><value> 设置键值的同时,设置过期时间,单位秒

15. getset<key><value>以新换旧, 设置了新值同时获得旧值

2.Hash

常用命令(示例):

hset<key><field><value><key>集合中的<field>键赋值<value>

hget< key1> <field><key1>集合<field>取出value

hmset<key1><field1><value1><field2><value...批量设置hash的值hexists<key1><field>查看哈希表key中,给定域field是否存在

hkeys<key>列出该hash集合的所有field

hlen<key>获取hash中元素的个数

hvals<key>列出该hash集合的所有value

hincrby<key><field><increment>为哈希表key中的域field的值加_上增量1 -1 hdel key field[field1,fiel..]删除hash中key对应的field元素


3.List

常用命令(示例):

lpush/rpush < key> <value1> <value2> <value3> ...EI1/#GjE- -↑EX N. Ipop/rpop <key>从左边/右边吐出一个值。值在键在,值光键亡。

rpoplpush <key1> <key2> M <key1> 5I€GẞW- -M, FE€J<key2> Eil

Irange<key><start><stop>jFR5l TiTXA1#Jä (MÆEJG)

lindex<key><index>按照索引下标获得元素(从左到右)

llen<key>获得列表长度

4.Set

常用命令(示例):

sadd <key> <value1> <value2> ....

将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略s smembers <key>取出该集合的所有值。+

sismember <key> <value>判断集合<key>是否为含有该<value>,1 ,没有0v scard <key>返回该集合的元素个数。

srem <key> <value1> <value2> .... 删除集合中的某个元素。

spop <key>随机从该集合中吐出一个值。

srandmember <key> <n>随机从该集合中取出n个值。不会从集合中删除。

5.Zset

常用命令(示例):

Zadd<key><score1><value1><score2><value2>...
将一个或多个member元素及其score值加入到有序集key当中。
Zrange<key><start><stop>[WITHSCORES]
返回有序集key中,下标在<start><stop>之 间的元素。

三、Redis的运用场景

1.信息校验

现在的互联网产品基本上都会用到用户登录验证功能,redis的数据结构是KV结构,作为缓存,许多公司可以将redis作为信息存储,将用户的token信息存入redis缓存中作为信息校验的工具。

2.数据缓存

我们知道,redis原生是通过c语言编写而成的非关系型数据库,数据都存放在内存中,而且具有可持久化的优点,读写速度可达到8w/s,性能十分优秀。所以在一些需要大批量数据读写的时候,为了避免系统和关系数据库的IO操作过大导致数据库崩溃,就采取选择redis作为中间件来做数据缓存,在用户需要对数据库做读操作时先经过缓存来查询,这样既避免了数据库的崩溃,也达到了快速得到结果的优点。

3.锁机制

redis有setNx操作,这个API是只有在Key不存在的时候才能设置该Key的值,那么这个特性可以让我们来做“锁”,当该Key被获取之后就无法再对该做任何操作,redis也能够将这个Key定时删除,属于原子操作,进一步保证了业务的完善性。

四、Redis目前存在的不足

1.缓存和数据库的一致性

一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。在对数据要求强一致性的情况下,使用redis是很难完全避免这种情况,策略只能降低其发生的概念。

2.缓存击穿和缓存雪崩

缓存雪崩:即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

缓存穿透:即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。

总结

Redis是一个高性能的基于Key-Value的内存数据库(C语言编写),支持的数据类型非常多,多运用与缓存来做大批量数据查询,同时Redis的操作是原子性的,就是说它的操作不会被线程调度机制而打断,这种操作一旦开始就运行到结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值