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的特点
- 读写速度非常快
Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。 - 可持久化
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。 - 支持主从模式
Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。
二、Redis的五大基本数据结构
1.String
- String是redis最基本的类型,一个key对应一个value。
- String类型是二进制安全的,意味着Redis的String可以包含任何数据,比如jpg图片或者序列化的对象。
- 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的操作是原子性的,就是说它的操作不会被线程调度机制而打断,这种操作一旦开始就运行到结束。