Redis系列学习(二)之命令行操作数据库

Redis系列学习(二)之命令行操作数据库

  • 一 引言
  • 二 redis配置介绍
  • 三 字符串
    • 1 增加
    • 2 删除
    • 3 修改
      • 直接覆盖使用新增命令只要key相同即可
      • 2 追加
      • 3数字增减
    • 4 查寻 get key
  • 四 哈希表
    • 增加
    • 删除
    • 修改
    • 查找
    • 扩展命令
      • 查找key是否存在表里
      • 获得表长度
      • 获得所有keys或所有values
  • 五 字符串列表List
    • 1增加
      • 无认表是否存在都插入到表里
      • 只有当表存在的情况下才插入
      • 3 在指定值前或后插入指定值
    • 2 删除
      • 1 弹出
      • 2 删除指定索引号值
    • 3修改
    • 4 查寻
    • 5 扩展命令
        • 表长度
    • 6 消息队列命令
  • 六Set和Sorted-set
  • 七通用的命令
    • 查询所有的key列表
    • 查询以指定字符串开头的key列表
    • 删除指定的key
    • 查询指定的key是否存在
    • 重命名key
    • 设置过期时间单位秒
    • 查看key离超时还剩的时间
    • 查看key的数据类型

一、 引言

本篇文章承接上篇《Redis系列学习(一)之概述及安装》,如果懂的赶紧去看,如果已经懂了可忽略。
我们将学习到redis的配置以及命令行操作数据的方法。


二、 redis配置介绍

2.1 打开redis目录,如下:
Redis系列学习(二)之命令行操作数据库_第1张图片

2.2 redis.windows.conf是redis数据库的配置信息,比较重要,不过我建议大概了解一下即可。
redis.windows.conf配置选项如下:

daemonize: 是否以后台进程运行,默认为no 

pidfile: 如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid 

bind: 绑定主机IP,默认值为127.0.0.1(注释) 

port: 监听端口,默认为6379 

timeout: 超时时间,默认为300(秒) 

loglevel: 日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning 

logfile: 日志记录方式,默认值为stdout 

databases: 可用数据库数,默认值为16,默认数据库为0 

save <seconds> <changes>: 指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。 
save 900 1  900秒(15分钟)内至少有1个key被改变 
save 300 10  300秒(5分钟)内至少有300个key被改变 
save 60 10000  60秒内至少有10000个key被改变 

rdbcompression: 存储至本地数据库时是否压缩数据,默认为yes 

dbfilename: 本地数据库文件名,默认值为dump.rdb 

dir: 本地数据库存放路径,默认值为 ./ 

slaveof <masterip> <masterport>: 当本机为从服务时,设置主服务的IP及端口(注释) 

masterauth <master-password>: 当本机为从服务时,设置主服务的连接密码(注释) 

requirepass: 连接密码(注释) ,默认是没密码的。

maxclients: 最大客户端连接数,默认不限制(注释) 

maxmemory <bytes> :设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释) 

appendonly :是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no 

appendfilename 更新日志文件名,默认值为appendonly.aof(注释) 

appendfsync: 更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。 

vm-enabled: 是否使用虚拟内存,默认值为no 

vm-swap-file: 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享 

vm-max-memory :将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

这里有篇文件介绍的也比较仔细,《redis.conf配置详细解析》


下面介绍的是命令行操作数据库以及redis提供的数据类型:

Redis提供了字符串(String),哈希表(hash),字符串列表(list),无序字符串集合(set),有序字符串集合(sorted set)5种数据类型。比较长用是String和hash
Redis是以key-value键值对保存据的NoSql数据库;
key的要求:不要太长,最好不要超过1024个字节,也不要太短,按普通的java驼峰命名即可。


三、 字符串

以二进制的形式来存储String,有增/删/改/查

1、 增加

语法:

set key value

例子:
输入:set name chenyuan
数据库:这里写图片描述
结果:这里写图片描述

再插入一条记录:set age 100

2、 删除

del key [key …]
可多删除n条记录,后面跟着n个key即可。

例子:
删除一条记录:del name
数据库:这里写图片描述

删除多条:del name age
结果:这里写图片描述
数据库:无数据


3、 修改

1 、 直接覆盖:使用新增命令,只要key相同即可。

例子:
输入:set name Huawei
数据库:这里写图片描述


2、 追加

语法:

append key value
返回:字符串长度

例子:
输入:set name hello
结果:这里写图片描述
数据库:这里写图片描述


3、数字增减

加1:incr key
减1:decr key
输入:incr num
结果:这里写图片描述
首先数据库redis中没有num,incr num会先将num的值赋值为0,然后加1;得到的结果是(integer)1;
数据库:这里写图片描述

输入:decr num1
结果:这里写图片描述
数据库redis中没有num2的值,数据库会先将num2的值赋值为0,然后再执行减1的操作,结果为(integer)-1;
数据库:这里写图片描述

加指定数量:incrby key incrnum(指定数量)
输入:incrby num 6
结果:这里写图片描述

减少指定数量:decrby key decrnum(指定数量)
输入:decrby num 6
结果:
这里写图片描述


4、 查寻 get key

此处略


四 哈希表

类似java里的hashMap。一个字符串key对应字符串集的map容器,说白了就是已经序列化的json格式数据。
每个hash可存储4294967295个键值对
提供了,增/删/改/查,它和String类型命令开头多一个”h”


1 增加

单条增加语法:

hset hashname key value
hset命令进行设置,key是hashname,键值对是key  value;表示往里面去存值,结果为:(integer)1

多条增加语法:

hmset hashname key1 value1 key2 value2
Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中h表示哈希表命令,"m"表示many。

例如
输入:hset test country china
结果:这里写图片描述
数据库:这里写图片描述

输入:hmset test sex man add nibo
结果:这里写图片描述
数据库:这里写图片描述


2 删除

删除表里某条记录语法

hdel hashName key [key …]
可单条删除也可多条删除,返回被删除的个数

删除哈希表语法

del hashName
将整个哈希表都删除

输入:hdel test country add
结果:这里写图片描述
数据库:这里写图片描述只余sex数据


3 修改

4.3.1 直接覆盖值使用新增加命令,保证key一样即可
4.3.2 修改数值
语法:

hincrby hashName num(增加值)
hincrby表示为某个属性增加数字

例子
输入:hincrby test age 1
输出:这里写图片描述
哈希数据结构没有支持字符串的追加以及减少的命令,减少数值的命令可用增加命令模拟,如下:
hincrby test age -1


4 查找

查找数据语法:

hget hashName key

5 扩展命令

1 查找key是否存在表里

语法

 hexists hashName key
 hexists判断myhash中的username属性的值是否存在,存在就返回1,不存在就返回0;和结果是1

例子
输入:hexists test age
结果:这里写图片描述


2 获得表长度

语法

hlen hashName

例子
输入:hlen test
结果:

这里写图片描述


3 获得所有keys或所有values

所有keys:hkeys hashName
所有values:hvals hashName

例子
keys输入:hkeys test
结果:
这里写图片描述

values输入:hvals test
结果:这里写图片描述


五、 字符串列表List

1、增加

1 无认表是否存在都插入到表里

语法

lpush listName str1 [str2 …]
lpush表示从左侧向链表中添加数据,返回成功插入的数量。

例如
输入:hlist testList 1 2 3 4 5 6 a b c d e f
结果:这里写图片描述
数据库:这里写图片描述
以字符串集合形势保存存储的数据


2 、只有当表存在的情况下才插入

语法

lpushx listName str1 [str2 …]

3、 在指定值前或后插入指定值

输入:linsert testList before d befored
数据库:这里写图片描述
成功在b元素前插入元素。

输入:linsert testList after d afterd
数据库:这里写图片描述
成功在b元素后插入元素。


2、 删除

1、 弹出

语法

rpop listName
lpop表示从左边儿(队尾)弹出 ,它会返回并弹出指定的key所关联的链表中的第一个元素,也就是它的头部元素;如果您不存在就会返回nil,如果存在就会返回第一个元素;testlist中的第一个元素是1,所以1就会被弹出来,结果为:1

结果
这里写图片描述
数据库:这里写图片描述


2、 删除指定索引号值

语法

lrem listName count value
该指令会删除count个值为value的元素; 如果count大于0则从头遍历;如果count小于0则从尾遍历;如果count等于0,删除链表中所有等于某个值的元素;

例如
value不存在情况
输入:lrem testList 1 999
结果:这里写图片描述
由于集合里不存在值为999的,所以主删除失败。

value存在的情况
输入:lrem testList 1 f
结果:
这里写图片描述
返回成功删除的个数。


3、修改

语法

lset listName
设置指定索引位置的值,索引号从0开始。

例如
输入:lset testList 0 9999
数据库:这里写图片描述


4、 查寻

语法

lrange listName startIndex endIndex
lrange表示查看链表, listName为想要查看的链表,后面的为从startIndex开始到endIndex结束;可以从0开始计数,也可以从负数开始计数,如果是-1表示是链表尾部的元素;-2则表示倒数第二个元素;

正常范围,输入:lrange testList 0 2
结果:这里写图片描述

负数,输入:lrange testList 0 -1
结果:Redis系列学习(二)之命令行操作数据库_第2张图片
如果是-1表示是链表尾部的元素;-2则表示倒数第二个元素

5、 扩展命令

1 表长度

语法

llen listName

输入:llen testList
结果:这里写图片描述
如果是不存在的表会怎样
输入:llen pp
结果:这里写图片描述


6、 消息队列命令

语法:rpoplpush list1 list2
从list1队头弹出一个元素插入到list2队尾
这个功能常用于消息队列的消息服务,完成多个程序之间的消息交互;
假设一个应用程序正在使用lpush向链表中添加新的元素,通常将这样的程序称为生产者,另一个程序正在使用rpop操作,从链表中取出元素,称为消费者;消费者程序在取出元素后崩溃,由于该消息已经被取出且没有被正常处理,我们认为这个消息已经丢失了,由此可能导致业务数据的丢失,或者导致业务状态的不一致等现象的发生,可以通过rpop,lpush这个命令,消费者程序在主消息队列中取出元素之后,再将它插入到一个备份的队列中,直到消费者程序完成正常的逻辑处理后,再讲消息从备份队列中删除,这样的话,我们可以提供一个守护的线程,当发现备份消息队列过期的时候,可以重新将它放到主消息的队列中,以便其他的消费者可以继续去处理;


六、Set和Sorted-set

最后二种数据结构体是:Set和Sorted-set它和java上Set概念是一样的,不允许重复,无序等等,你想想我们在写java程序里会经常使用到Set集合类吗,所以这里就不介绍Set数据结构体了,需要时再查询也不迟。


七、通用的命令

1 查询所有的key列表

语法

keys *

2 查询以指定字符串开头的key列表

语法

keys test*

3 删除指定的key

语法

del key [key …]

4 查询指定的key是否存在

语法

exist key

5 重命名key

语法

rename oldley newKey

6 设置过期时间,单位秒

expire key time

7 查看key离超时还剩的时间

ttl key
注意:如果没有设置key的超时时间,就会返回-1;

8 查看key的数据类型

语法

type key
查看key的类型;比如:string,list,hash,set,sorted-set

PS:

技术的学习一定要细心一点,多提问

你可能感兴趣的:(redis)