一、简介
redis是一种NoSQL数据库。NoSql数据的共同特点是去掉关系型数据的关系型特点。数据之间没有关系,这样就非常容易扩展。也无形之间,在架构层面上带来了可扩展的能力。
[官网][https://redis.io/documentation]
| RDBMS | Nosql |
|---|---|
| 结构化查询语言 | 没有声明查询语言 |
| 数据和关系都存储在单独的表中 | 键值对存储、列存储、文档存储、图形数据库 |
| 严格一致性 | 最终一致性、高性能、高可用和可伸缩性 |
| 结构化数据 | 非结构化和不可预知的数据 |
传统的ACID:A(Atomicity)原子性,C(consistency)一致性,I(Isolation) 隔离性,D(Durability)持久性
CAP理论:
- C(consistency)一致性:在分布式环境中,一致性是指在多个数据副本之间保持一致的特性。在一致性的需求下,当一个系统在数据一致性的要求下执行更新操作,应该保证系统的数据任然处于一致的状态。
- A(Availability)可用性:可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
- P(Partition tolerance)分区容错性:分区容错性约束了一个分布式系统需要具有如下特性:分布式系统在遇到任何网络分区故障的时候,需要能够保证对外提供一致性和可用性服务。
jedispool 的连接池耗尽的时候会抛如下异常:Could not get a resource since the pool is exhausted
二、redis 安装
下载及安装
$ wget http://download.redis.io/releases/redis-5.0.6.tar.gz $ tar xzf redis-5.0.6.tar.gz $ cd redis-5.0.6 $ make
启动redis服务器
$ src/redis-server
启动redis客户端并进行测试
$ src/redis-cli redis> set foo bar OK redis> get foo "bar"
三、redis 命令学习
redis 支持的常用五种数据结构:string(字符串类型),list(列表类型)、hash (散列类型)、set(集合类型)、sortSet(有序集合类型)
-
redis的key- redis的key是二进制安全(可以任何二进制序列作为键)的,空字符串也是一个合法的key.
- 太长的key值不是好主意
- 消耗内存
- 查找键消耗时间长
- 太短的key也不是好主意
- 可读性太差
- 容易发生键冲突
- 试着坚持一个模式。例如,“object-type:id”是一个好主意
- 键最大允许值为 512M
-
redisstring类型string 类型是最简单的一种redis数据类型。
常用命令:
-
SETSET KEY VALUE [EX seconds] [PX milliseconds] [NX|EX]
设置字符串的值为value。如果
key已经有其他值,set 会覆盖旧值。无视类型示例:
-
对不存在的键设值
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set key value
OK
127.0.0.1:6379> get key
“value” -
对已经存在的键进行设值
127.0.0.1:6379> exists key
(integer) 1
127.0.0.1:6379> set key newValue
OK
127.0.0.1:6379> get key
“newValue” -
使用
EX参数添加过期时间,以秒为单位
127.0.0.1:6379> set key newValue ex 100
OK
127.0.0.1:6379> ttl key
(integer) 92 -
使用
pX参数添加过期时间,以毫秒为单位
127.0.0.1:6379> set key-with-expire-time value px 5000
OK
127.0.0.1:6379> pttl key-with-expire-time
(integer) 3119 -
使用
NX参数键不存在的时可以设值成功
127.0.0.1:6379> set no-exists-key value NX EX 100
OK #
127.0.0.1:6379> set no-exists-key value NX EX 100
(nil) # 可以利用此特性来设置一个分布锁的枷锁功能 键存在的时候,设置不成功 -
使用
EX参数只有当键存在的时候,才能设值成功
127.0.0.1:6379> exists exists-key
(integer) 0 #键不存在
127.0.0.1:6379> set exists-key value xx
(nil) #不存在,所以设值失败
127.0.0.1:6379> set exists-key value
OK #先设值
127.0.0.1:6379> set exists-key newvalue xx
OK #设值新值是否成功
127.0.0.1:6379> get exists-key
“newvalue”
-
-
GET: GET key返回
key对应的字符串。如果key 不存在,返回特使值
nil;否则返回key的值。如果key的值并非字符串类型,返回一个错误。因为
GET命令只能用于字符串值。示例代码:
127.0.0.1:6379> get exists-key
“newvalue”
127.0.0.1:6379> get no_exists_key
(nil)127.0.0.1:6379> rpush mylist 1 2 3 5 6 6 7 8
(integer) 8
127.0.0.1:6379> get mylist
(error) WRONGTYPE Operation against a key holding the wrong kind of value -
INCR: INCR key为key 存储的数字值加一。并返回执行加一操作后的值
如果键
key不存在, 那么它的值会先被初始化为0, 然后再执行INCR命令。如果键
key储存的值不能被解释为数字, 那么INCR命令将返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。
INCR
命令是一个针对字符串的操作。 因为 Redis 并没有专用的整数类型, 所以键key储存的值在执行INCR` 命令时会被解释为十进制 64 位有符号整数。示例:
127.0.0.1:6379> incr k2
(integer) 1
127.0.0.1:6379> incr k2
(integer) 2
127.0.0.1:6379> incr k2
(integer) 3
127.0.0.1:6379> incr k2
(integer) 4 -
INCRBY:incrby key increment为键
key储存的数字值加上增量increment。并返回加上incrment之后的值。如果键
key不存在, 那么键key的值会先被初始化为0, 然后再执行INCRBY命令。如果键
key储存的值不能被解释为数字, 那么INCRBY命令将返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。
示例:
127.0.0.1:6379> set k3 20
OK
127.0.0.1:6379> incrby k3 50
(integer) 70 -
DECR;decy key将key的值减一
-
DECRBY将key key 减一个固定值。并返回操作后的值
-
MSET:MSET key value [key value …]同时为多个键设值
如果某个给定键已经存在, 那么
MSET将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用MSETNX命令, 这个命令只会在所有给定键都不存在的情况下进行设置。MSET是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK127.0.0.1:6379> del “k1 v1”
(integer) 1
127.0.0.1:6379> keys k*- “k1”
- “k4”
- “k3”
- “k2”
-
MGET同时获取多个键的值:
127.0.0.1:6379> mget k1 k2 k3 k4
- “v1”
- “v2”
- “v3”
- “v4”
其他命令:
-
SETNX只在键
key不存在的情况下, 将键key的值设置为value。若键
key已经存在, 则SETNX命令不做任何动作。SETNX是『SET if Not eXists』(如果不存在,则 SET)的简写。设值成功返回1,失败返回0.
127.0.0.1:6379> setnx k1 newV1
(integer) 0
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> setnx k1 newV1
(integer) 1 -
SETEX将键
key的值设置为value, 并将键key的生存时间设置为seconds秒钟。如果键
key已经存在, 那么SETEX命令将覆盖已有的值。setEX 是一个原子性操作。它可以在同一时间内完成设值和设置过期时间的这两个操作。
-
PSETEX类似于 SETNX ,但是其过期时间为 毫秒。
-
STRLEN返回字符串值的长度。当key 不存在的时候返回0。如果存储的不是字符串,返回一个错误。
127.0.0.1:6379> strlen k1
(integer) 5
127.0.0.1:6379> get k1
“newV1” -
APPEND如果键
key已经存在并且它的值是一个字符串,APPEND命令将把value追加到键key现有值的末尾。如果
key不存在,APPEND就简单地将键key的值设为value, 就像执行SET key value一样。返回值:追加
value之后, 键key的值的长度。127.0.0.1:6379> append k1 appendValue
(integer) 16
127.0.0.1:6379> get k1
“newV1appendValue” -
SETRANGE从偏移量
offset开始, 用value参数覆写(overwrite)键key储存的字符串值。不存在的键
key当作空白字符串处理。当生成一个很长的字符串时, Redis 需要分配内存空间, 该操作有时候可能会造成服务器阻塞(block)。 在2010年出产的Macbook Pro上, 设置偏移量为 536870911(512MB 内存分配)将耗费约 300 毫秒, 设置偏移量为 134217728(128MB 内存分配)将耗费约 80 毫秒, 设置偏移量 33554432(32MB 内存分配)将耗费约 30 毫秒, 设置偏移量为 8388608(8MB 内存分配)将耗费约 8 毫秒。
127.0.0.1:6379> set greeting “hello world”
OK
127.0.0.1:6379> SETRANGE greeting 6 “Redis”
(integer) 11
127.0.0.1:6379> get greeting
“hello Redis” -
GETSET
将键
key的值设为value, 并返回键key在被设置之前的旧值。返回值:
返回给定键
key的旧值。如果键
key没有旧值, 也即是说, 键key在被设置之前并不存在, 那么命令返回nil。当键
key存在但不是字符串类型时, 命令返回一个错误。127.0.0.1:6379> getset greeting “hello world”
“hello Redis”
127.0.0.1:6379> get greeting
“hello world” -
GETRANGE返回键
key储存的字符串值的指定部分, 字符串的截取范围由start和end两个偏移量决定 (包括start和end在内)。负数偏移量表示从字符串的末尾开始计数,
-1表示最后一个字符,-2表示倒数第二个字符, 以此类推。GETRANGE通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。127.0.0.1:6379> set key “hello world”
OK
127.0.0.1:6379> GETRANGE key 0 4
“hello” -
INCRBYFLOAT为键
key储存的值加上浮点数增量increment。如果键
key不存在, 那么INCRBYFLOAT会先将键key的值设为0, 然后再执行加法操作。如果命令执行成功, 那么键
key的值会被更新为执行加法计算之后的新值, 并且新值会以字符串的形式返回给调用者。无论是键
key的值还是增量increment, 都可以使用像2.0e7、3e5、90e-2那样的指数符号(exponential notation)来表示, 但是, 执行 INCRBYFLOAT 命令之后的值总是以同样的形式储存, 也即是, 它们总是由一个数字, 一个(可选的)小数点和一个任意长度的小数部分组成(比如3.14、69.768,诸如此类), 小数部分尾随的0会被移除, 如果可能的话, 命令还会将浮点数转换为整数(比如3.0会被保存成3)。此外, 无论加法计算所得的浮点数的实际精度有多长,
INCRBYFLOAT命令的计算结果最多只保留小数点的后十七位。127.0.0.1:6379> set floatkey 1
OK
127.0.0.1:6379> INCRBYFLOAT floatkey 0.3
“1.3” -
MSETNX当且仅当所有的key不存在的时候,为所有的key设置值
即使只有一个给定键已经存在,
MSETNX命令也会拒绝执行对所有键的设置操作。MSETNX是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。返回值:成功1,失败:0
-
-
redislist类型 -
redis hash类型 -
HSET hash field value将哈希表
hash中域field的值设置为value。如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行
HSET操作。如果域
field已经存在于哈希表中, 那么它的旧值将被新值value覆盖。返回值
当
HSET命令在哈希表中新创建field域并成功为它设置值时, 命令返回1; 如果域field已经存在于哈希表, 并且HSET命令成功使用新值覆盖了它的旧值, 那么命令返回0。127.0.0.1:6379> hset user:1 name zhangsan
(integer) 1
127.0.0.1:6379> hget user:1 name
“zhangsan”
127.0.0.1:6379> hset user:1 name libai
(integer) 0
127.0.0.1:6379> hget user:1 name
“libai”
本文深入探讨Redis的五种核心数据结构:字符串、列表、散列、集合和有序集合的特点与应用场景。详述了每种数据类型的常用命令,如SET、GET、INCR、DECR、MSET等,以及如何通过这些命令进行高效的数据操作。
1599

被折叠的 条评论
为什么被折叠?



