01-Redis-基础

发布于:2025-04-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

1 redis诞生历程

        redis的作者笔名叫做antirez,2008年的时候他做了一个记录网站访问情况的系统,比如每天有多少个用户,多少个页面被浏览,访客的IP、操作系统、浏览器、使用的搜索关键词等等(跟百度统计、CNZZ功能一样)。最开始存储方案用MySQL,但是实在慢的不行,09年的时候antirez就自己写了一个内存的list,这就是redis。

最开始redis支持List。现在数据类型丰富了、功能也丰富了,在全世界都非常的流行。
redis(REmote DIctionary Service),远程字典服务。

2 SQL与NOSQL

        在绝大部分的时候,我们都会先考虑使用关系型数据库来存储业务数据,比如MySQL、Oracle等等。
        关系型数据库特点:
        1、它以表格的形式,基于行存储数据,是一个二维模式
        2、它存储的是结构化的数据,数据存储有固定的模式(schema),数据需要适用表结构
        3、表与表之间存在关联(Relationship)
        4、大部分关系型数据库都支持SQL(结构化查询语言)的操作,支持复杂的关联查询
        5、通过支持事务(ACID)来提供严格或者实时的数据一致性
        

        关系型数据库也存在一些限制:
        1、要实现扩容的话,只能向上(垂直)扩展,比如磁盘限制了数据的存储,就要扩大磁盘容量
             通过堆硬件的方式,不支持动态的扩缩容。水平扩容需要复杂的技术来实现,比如分库分
             表。
        2、表结构修改困难,因此存储的数据格式也受到限制
        3、关系型数据库通常会把数据持久化到磁盘,在高并发和高数据量的情况下,基于磁盘的读
              写压力比较大。
        

        为了解决关系型数据库的限制,所以有了非关系型数据库的存在,我们一般叫做non-relational或者Not Only SQL。NoSQL最开始是不提供SQL(Structured Query Language)的数据库的意思。
        非关系型数据库的特点:
        1、存储非结构化的数据,比如文本、图片、音频、视频
        2、表与表之间没有关联,可扩展性强
        3、保证数据的最终一致性,遵循BASE(碱)理论。Basically Available(基本可用); Soft-state
               (软状态) Eventually Consistent(最终一致性)
        4、支持海量数据的存储和高并发的高效读写
        5、支持分布式,能够对数据进行分片存储、扩缩容简单

对于不同的存储类型,我们又有各种各样的非关系型数据库,比如有几种常见的类型:
        1、KV存储:redis和Memcached
        2、文档存储: MongoDB
        3、列存储:HBase
        4、图存储:Neo4j
        5、对象存储
        6、XML存储等等

SQL与NoSQL的特性合在一起NewSQL数据库,NewSQL结合了SQL与NoSQL的特性,例如TiDB、VoltDB、ScaleDB

特性 SQL NoSQL NewSQL
关系模型 没有
SQL语法 没有
ACID 没有
水平扩展 没有
海量数据 没有
无结构化 没有 没有

 3 redis 特性

        对于redis,我们大部分的时候认识一个缓存的组件,当然从它的发展历史我们也可以看到,它最开始并不是作为缓存使用的,只是在很多的互联网应用里面,它作为缓存发挥了最大的作用1、把数据放到内存中:一是内存的速度更快,10W QPS; 二是减少计算的时间,减轻数据库压力。

2、如果用内存的数据结构作为缓存,为什么不用HashMap或者Memcached;
        1)、更丰富的数据类型 
         2)、支持多种编程语言 
        3)、功能丰富:持久化机制、内存淘汰策略、事务、发布订阅、pipeline、lua
        4)、支持集群、分布式

4 基本数据类型

4.1 String字符串

       最基本也是最常用的数据类型就是String,set和get命令就是String的操作命令,redis的字符串被叫做二进制安全的字符串。

#获取指定范围的字符
getrange bonnie 0 1
# 获取值长度
strlen bonnie
#字符串追加内容
append bonnie good
# 设置多个值(批量操作,原子性)
mset bonnie 2673 huihui 666
#获取多个值
mget bonnie huihui
# 设置值,如果 key 存在,则不成功
setnx bonnie pyy
# 基于此可实现分布式锁。用 del key 释放锁。
#但如果释放锁的操作失败了,导致其他节点永远获取不到锁,怎么办?
# 加过期时间。单独用 expire 加过期,也失败了,无法保证原子性,怎么办?多参数set key value [expiration EX seconds|PX millisecondsl[NX|XX]
#使用参数的方式
set k1 v1 EX 10 NX
#整数值递增(值不存在会得到1)
incr bonnie
incrby bonnie 100
#整数值递减
decr bonnie
decrby bonnie 100
# 浮点数增量
set mf 2.6
incrbyfloat mf 7.3

4.2 Hash

Hash用来存储多个无序键值对,最大存储数量2的32次方-1(40亿左右)

# key: h1  field: f  value: 6
hset hl f 6
# key: h1  field: e  value: 5
hset hl e 5
# 批量设置多个field
hmset hl a l b 2 c3 d 4
hget hl a
hmget hl a b c d
hkeys hl
hvals hl
hgetall hl
hdel h1 a
hlen h1

    4.3 List列表

        存储有序的字符串(从左到右),元素可以重复,最大的存储数量2的32次方-1(40亿左右)

lpush queue a
lpush queue b c
rpush queue d e
lpop queue
rpop queue
lindex queue 0
lrange queue 0 -1

4.4  set集合

        set存储String类型的无序集合,最大存储数量2的32次方-1(40亿左右)

// 添加一个或者多个元素
sadd myset a b c d e f g
// 获取所有元素
smembers myset
// 统计元素个数
scard myset
// 随机获取一个元素
srandmember myset
// 随机弹出一个元素
/spop myset/
/移除一个或者多个元素
srem myset d e f
// 查看元素是否存在
sismember myset a

  4.5 Zset有序集合  

sorted set存储有序的元素,每个元素有score,按照score从小到大排名,score相同时,按照key的ASCLL码排序

// 添加元素
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
// 获取全部元素
zrange myzset 0 -l withscoreszrevrange myzset 0 -l withscores
// 根据分值区间获取元素
zrangebyscore myzset 20 30
//移除元素 也可以根据 score rank 删除
zrem myzset php cpp
//统计元素个数
zcard myzset
//分值递增
zincrby myzset 5 python
//根据分值统计个数
zcount myzset 20 60
// 获取元素 rank
zrank myzset python
// 获取元素 score
zscore myzset python
//也有倒序的 rev操作(reverse)

本章节简单讲了下redis的五种基本数据类型,下章节讲解底层数据结构,以及实现


网站公告

今日签到

点亮在社区的每一天
去签到