redis-(原理&命令行操作)
redis-(原理&命令行操作)
常用网址:
1 Redis是什么
Redis:REmote DIctionary Server(远程字典服务器)
是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服器 Redis(key-value)三个特点 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 Redis能干嘛 内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面 发布、订阅消息系统 地图信息分析 定时器、计数器 ...... 特性 数据类型、基本操作和配置 持久化和复制,RDB、AOF 事务的控制 .....
2 基本数据库知识
默认16个数据库,类似数组下标从零开始,初始默认使用零号库 #查看 redis.conf ,里面有默认的配置 #databases 16 1.1 Select命令切换数据库 (# 不同的库可以存不同的数据) 127.0.0.1:6379> select 7 OK 127.0.0.1:6379[7]> 1.2 Dbsize查看当前数据库的key的数量 127.0.0.1:6379[7]> DBSIZE (integer) 0 1.3 查看具体的key 127.0.0.1:6379> keys * 1.4 清空数据库 Flushdb:清空当前库 Flushall:清空全部的库
3 redis键
# keys * 查看所有的key 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> set name qinjiang OK 127.0.0.1:6379> keys * 1) "name" # exists key 的名字,判断某个key是否存在 127.0.0.1:6379> EXISTS name (integer) 1 127.0.0.1:6379> EXISTS name1 (integer) 0 # move key db ---> 移除key到另一个库 127.0.0.1:6379> move name 1 (integer) 1 127.0.0.1:6379> keys * (empty list or set) expire key 秒钟:为给定 key 设置生存时间,当 key 过期时(生存时间 为0 ),它会被自动删除。 # ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期 127.0.0.1:6379> set name qinjiang OK 127.0.0.1:6379> EXPIRE name 10 # 10s后过期 (integer) 1 127.0.0.1:6379> ttl name (integer) 4 127.0.0.1:6379> ttl name 127.0.0.1:6379> ttl name (integer) 1 127.0.0.1:6379> ttl name (integer) -2 127.0.0.1:6379> keys * (empty list or set) # type key 查看你的key是什么类型 127.0.0.1:6379> set name qinjiang OK 127.0.0.1:6379> get name "qinjiang" 127.0.0.1:6379> type name string
3 String(字符串类型)
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。常规key-value缓存应用:
常规计数:微博数,粉丝数等。
======================================== # set、get、del、append、strlen ======================================== 127.0.0.1:6379> set key1 value1 #设置值 OK 127.0.0.1:6379> get key1 #获得key "value1" 127.0.0.1:6379> del key1 #删除key (integer) 1 127.0.0.1:6379> keys * #查看全部的key (empty list or set) 127.0.0.1:6379> exists key1 确保 key1 不存在 (integer) 0 127.0.0.1:6379> append key1 "hello" # 对不存在的 key 进行 APPEND ,等同于 SET key1 "hello" (integer) 5 ## 字符长度 127.0.0.1:6379> APPEND key1 "-2333" # 对已存在的字符串进行APPEND (integer) 10 # 长度从 5 个字符增加到 10 个字符 127.0.0.1:6379> get key1 "hello-2333" 127.0.0.1:6379> STRLEN key1 # 获取字符串的长度 (integer) 10 ======================================== # incr、decr 一定要是数字才能进行加减,+1 和 -1。 # incrby、decrby 命令将 key 中储存的数字加上指定的增量值。 ======================================== 127.0.0.1:6379> set views 0 # 设置浏览量为0 OK 127.0.0.1:6379> incr views # 浏览+ 1 (integer) 1 127.0.0.1:6379> incr views # 浏览+ 1 (integer) 2 127.0.0.1:6379> decr views # 浏览- 1 (integer) 1 127.0.0.1:6379> incrby views 10 #+10 (integer) 11 127.0.0.1:6379> decrby views 10 #-10 (integer) 1 #======================================= # range [范围] # getrange 获取指定区间范围内的值,类似between...and的关系,从零到负一表示全部 ======================================== 127.0.0.1:6379> set key2 abcd123456 # 设置key2的值 OK 127.0.0.1:6379> getrange key2 0 -1 # 获得全部的值 "abcd123456" 127.0.0.1:6379> getrange key2 0 2 # 截取部分字符串 "abc" ======================================== # setrange 设置指定区间范围内的值,格式是setrange key值 具体值 ======================================== 127.0.0.1:6379> get key2 "abcd123456" 127.0.0.1:6379> SETRANGE key2 1 xx # 替换值 (integer) 10 127.0.0.1:6379> get key2 "axxd123456" ======================================== # setex(set with expire)键秒值 # setnx(set if not exist) ======================================== 127.0.0.1:6379> setex key3 60 expire # 设置过期时间 OK 127.0.0.1:6379> ttl key3 # 查看剩余的时间 (integer) 55 127.0.0.1:6379> setnx mykey "redis" # 如果不存在就设置,成功返回1 (integer) 1 127.0.0.1:6379> setnx mykey "mongodb" # 如果存在就设置,失败返回0 (integer) 0 127.0.0.1:6379> get mykey "redis" ======================================== # mset Mset 命令用于同时设置一个或多个 key-value 对。 # mset Mget 命令返回所有(一个或多个)给定 key 的值。 # 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值nil 。 # msetnx 当所有 key 都成功设置,返回 1 #如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0原子操作 ======================================== 127.0.0.1:6379> mset k10 v10 k11 v11 k12 v12 OK 127.0.0.1:6379> keys * 1) "k12" 2) "k11" 3) "k10" 127.0.0.1:6379> mget k10 k11 k12 k13 1) "v10" 2) "v11" 3) "v12" 4) (nil) 127.0.0.1:6379> msetnx k10 v10 k15 v15 # 原子性操作! (integer) 0 127.0.0.1:6379> get key15 (nil) # 传统对象缓存 set user:1 value(json数据) # 可以用来缓存对象 mset user:1:name zhangsan user:1:age 2 mget user:1:name user:1:age ======================================== # getset(先get再set) ======================================== 127.0.0.1:6379> getset db mongodb # 没有旧值,返回 nil (nil) 127.0.0.1:6379> get db "mongodb" 127.0.0.1:6379> getset db redis # 返回旧值 mongodb "mongodb" 127.0.0.1:6379> get db "redis"
4 列表List(单值多Value)
最新消息排行,消息队列
======================================== # Lpush:将一个或多个值插入到列表头部。(左) # rpush:将一个或多个值插入到列表尾部。(右) # lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END指定。 # 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 # 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 ======================================== 127.0.0.1:6379> LPUSH list "one" (integer) 1 127.0.0.1:6379> LPUSH list "two" (integer) 2 127.0.0.1:6379> RPUSH list "right" (integer) 3 127.0.0.1:6379> Lrange list 0 -1 1) "two" 2) "one" 3) "right" 127.0.0.1:6379> Lrange list 0 1 1) "two" 2) "one" ======================================== # lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。 # rpop 移除列表的最后一个元素,返回值为移除的元素。 =================================================== 127.0.0.1:6379> Lpop list "two" 127.0.0.1:6379> Rpop list "right" 127.0.0.1:6379> Lrange list 0 -1 1) "one" ======================================== # Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个) ======================================== 127.0.0.1:6379> Lindex list 1 (nil) 127.0.0.1:6379> Lindex list 0 "one" 127.0.0.1:6379> Lindex list -1 "one" ======================================== # llen 用于返回列表的长度。 ======================================== 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> Lpush list "one" (integer) 1 127.0.0.1:6379> Lpush list "two" (integer) 2 127.0.0.1:6379> Lpush list "three" (integer) 3 127.0.0.1:6379> Llen list # 返回列表的长度 (integer) 3 ======================================== # lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。 ======================================== 127.0.0.1:6379> lrem list 1 "two" (integer) 1 127.0.0.1:6379> Lrange list 0 -1 1) "three" 2) "one" ======================================== # Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区 间之内的元素都将被删除。 ======================================== 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 127.0.0.1:6379> RPUSH mylist "hello" (integer) 2 127.0.0.1:6379> RPUSH mylist "hello2" (integer) 3 127.0.0.1:6379> RPUSH mylist "hello3" (integer) 4 127.0.0.1:6379> ltrim mylist 1 2 OK 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "hello2" ======================================== # rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。 ======================================== 127.0.0.1:6379> rpush mylist "hello" (integer) 1 127.0.0.1:6379> rpush mylist "foo" (integer) 2 127.0.0.1:6379> rpush mylist "bar" (integer) 3 127.0.0.1:6379> rpoplpush mylist myotherlist "bar" 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "foo" 127.0.0.1:6379> lrange myotherlist 0 -1 1) "bar" ======================================== # lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。 ======================================== 127.0.0.1:6379> exists list # 对空列表(key 不存在)进行 LSET (integer) 0 127.0.0.1:6379> lset list 0 item # 报错 (error) ERR no such key 127.0.0.1:6379> lpush list "value1" # 对非空列表进行 LSET (integer) 1 127.0.0.1:6379> lrange list 0 0 1) "value1" 127.0.0.1:6379> lset list 0 "new" # 更新值 OK 127.0.0.1:6379> lrange list 0 0 1) "new" 127.0.0.1:6379> lset list 1 "new" # index 超出范围报错 (error) ERR index out of range ======================================== # linsert key before/after pivot value 用于在列表的元素前或者后插入元素。 # 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 ======================================== redis> RPUSH mylist "Hello" (integer) 1 redis> RPUSH mylist "World" (integer) 2 redis> LINSERT mylist BEFORE "World" "There" (integer) 3 redis> LRANGE mylist 0 -1 1) "Hello" 2) "There" 3) "World"
作者:华王
博客:https://www.cnblogs.com/huahuawang/
浙公网安备 33010602011771号