Redis下载安装、数据类型及常用命令、事务说明

本文深入解析Redis的五种核心数据类型:String、List、Hash、Set和Zset,以及事务处理机制。详述每种类型的特点、应用场景和常用命令,如get、set、lpush、sadd、zadd等,同时介绍如何使用事务和设置过期时间。

下载:https://redis.io/download,或通过下载工具下载,以Centos为例

wget -q http://download.redis.io/releases/redis-4.0.14.tar.gz

安装

[root@localhost ~]# tar -zxvf redis-4.0.14.tar.gz 
...
[root@localhost redis-4.0.14]# make
...

  如果make过程中出现:/bin/sh: cc: 未找到命令,说明未安装gcc,执行以下命令进行安装

yum install gcc-c++ -y

  如果出现:zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录,执行以下命令

make MALLOC=libc

启动    

[root@localhost src]# cd src
[root@localhost src]# ./redis-server ../redis.conf
22053:C 07 Sep 10:48:37.996 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
22053:C 07 Sep 10:48:37.996 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=22053, just started
22053:C 07 Sep 10:48:37.996 # Configuration loaded
22053:M 07 Sep 10:48:37.997 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.14 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 22053
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
...

数据类型、及常用命令

    String:redis中最基本的类型,实际上可以包含任何数据,除string串外,还可以存储图片或序列化后的对象等,最大存储数据量为512M。常用命令如get、set、del、incr/incrby、decr/decrby、append、getrange(相当于substring)、setnx(不存在则创建)等等

127.0.0.1:6379> set num 1 ex 100
OK
127.0.0.1:6379> incrby num 10
(integer) 11
127.0.0.1:6379> append num 20
(integer) 4
127.0.0.1:6379> get num
"1120"
127.0.0.1:6379> getrange num 0 2
"112"
127.0.0.1:6379> 

    List:相当于Java中的LinkedList,支持将数据添加到列表头部<左边>或尾部<右边>,可存元素个数为2的32次方-1。常用命令令有lpush/rpush、lpop/rpop、lrang、lindex、llen、ltrim(相当于Java中的subList),前缀L代表从左往右,R代表从右往左。此外还支持blpop/brpop方式,在列表为空时,通过阻塞等待的方式,从列表中弹出最左/最右数据。
    值得注意的是,当用rpush添加多个值时,会依次按顺序将每个参数放到最右边,所以最终结果顺序就是参数的顺序。而lpush则刚好相反,会依次按顺序将每个参数放到最左边,所以最后的一个参数在最前面,与参数顺序是相反的。如下

127.0.0.1:6379> rpush bklist item01 item02
(integer) 2
127.0.0.1:6379> lrange bklist 0 10
1) "item01"
2) "item02"
127.0.0.1:6379> lpush bklist item03 item04
(integer) 4
127.0.0.1:6379> lrange bklist 0 10
1) "item04"
2) "item03"
3) "item01"
4) "item02"
127.0.0.1:6379> lpop bklist
"item04"
127.0.0.1:6379> rpop bklist
"item02"
127.0.0.1:6379> lindex bklist 0
"item03"
127.0.0.1:6379> 

    Hash:基于key-value对的集合,相当于Java里面的Map,所以它非常方便用来存储对象。常用命令有hset/hmset、hget/hmget/hgetall、hdel、hlen、hexists、hkeys、hvals、hincrby等等。如下

127.0.0.1:6379> hmset nodeInfo01 cpuCount 8 currentTask 100
OK
127.0.0.1:6379> hmget nodeInfo01 cpuCount currentTask
1) "8"
2) "100"
127.0.0.1:6379> hgetall nodeInfo01
1) "cpuCount"
2) "8"
3) "currentTask"
4) "100"
127.0.0.1:6379> hvals nodeInfo01
1) "8"
2) "100"
127.0.0.1:6379> hincrby nodeInfo01 currentTask 1
(integer) 101
127.0.0.1:6379> hvals nodeInfo01
1) "8"
2) "101" 
127.0.0.1:6379> hdel nodeInfo01 cpuCount currentTask
(integer) 2
127.0.0.1:6379> 

   Set:相当于Java中的HashSet,一个无序且去重的集合,底层为Hash表结构。所以它CRUD的复杂度都是O(1)。常用命令有sadd添加元素,成功返回1,否则返回0;srem移除元素;scard返回数量;sismember检查给定元素是否存在;smembers用来获取集合列表,随着元素的增多,该命令会相应的变慢; spop从集合中随机删除一个元素并返回;smove srckey destey itemxx 将源集合中某个元素移到目标集合中(是移除);

127.0.0.1:6379> sadd setkey set01 set02 set03
(integer) 3
127.0.0.1:6379> sismember setkey set04
(integer) 0
127.0.0.1:6379> sismember setkey set01
(integer) 1
127.0.0.1:6379> smembers setkey
1) "set03"
2) "set01"
3) "set02"
127.0.0.1:6379> srem setkey set01
(integer) 1
127.0.0.1:6379> 

  Zset:和set一样不允许重复,但有序。实现原理是通过给每个元素指定一个分数score,将元素按分数进行从小到大的排序来达到效果,元素虽然不能重复,但分数是可以重复的。命令主要有zadd、zrange、zcard、zincrby(添加分数)、zscore(获取分值)、zrank(获取排名)、zrangebyscore、zcount(min,max)返回该分值范围内的元素个数、zrem、zrevrank(反转,按从大到小排序返回元素排名)等等。zrangebyscore用来获取在给定分值范围内的元素。

127.0.0.1:6379> zadd top3 100 item01 80 item02 60 item03
(integer) 3
127.0.0.1:6379> zrange top3 0 10
1) "item03"
2) "item02"
3) "item01"
127.0.0.1:6379> zrangebyscore top3 0 80
1) "item03"
2) "item02"
127.0.0.1:6379> zscore top3 item01
"100"
127.0.0.1:6379> zrank top3 item01
(integer) 2
127.0.0.1:6379> zcount top3 0 80
(integer) 2
127.0.0.1:6379> zincrby top3 11 item01
"111"
127.0.0.1:6379> zscore top3 item01
"111"

事务命令
   
redis事务从开始到执行会经历以下三个阶段:

  • 开始事务:客户端执行multi命令
  • 命令入队:redis接收到客户端的multi命令后,会将这个客户端后续的所有命令放到一个队列里面,直到接收到提交或取消命令。Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
  • 提交/消息事务:客户端发送exec或discard命令

    值得注意的是,与关系型数据库不一样,虽然单个Redis命令的执行是原子性的,但Redis没有在事务上保证原子性,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做,所以Redis事务的执行并不是原子性的。而在关系型数据库的事务中会对被访问的数据进行加锁,直到事务被提交或回滚为止,在此期间如果其它客户端试图修改被加锁的数据,会被阻塞。
    不过在Redis中,客户端可以通过Watch监视了一个(或多个) key,如果在事务提交前这些key被其客户端进行了修改,那么执行了watch的客户端就会收到通知,该客户端事务的提交也不会成功,说到底其实watch就是一种乐观锁的机制。
    如下,在事务中的第二条指令出错,并不会导致第一条回滚,也不会导致第三方不执行。

127.0.0.1:6379> set ka abc
OK
127.0.0.1:6379> watch ka
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set hh hh
QUEUED
127.0.0.1:6379> incr ka
QUEUED
127.0.0.1:6379> set ff ff
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> get hh
"hh"
127.0.0.1:6379> get ff
"ff"
127.0.0.1:6379> 

其它命令
    设置过期时间:expire key-name seconds
    查看过期时间: ttl key-name
    移除过期时间:persist key-name

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值