Redis系列学习(二)之命令行操作数据库
本篇文章承接上篇《Redis系列学习(一)之概述及安装》,如果懂的赶紧去看,如果已经懂了可忽略。
我们将学习到redis的配置以及命令行操作数据的方法。
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,有增/删/改/查
语法:
set key value
例子:
输入:set name chenyuan
数据库:
结果:
再插入一条记录:set age 100
del key [key …]
可多删除n条记录,后面跟着n个key即可。
语法:
append key value
返回:字符串长度
例子:
输入:set name hello
结果:
数据库:
加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
结果:
此处略
类似java里的hashMap。一个字符串key对应字符串集的map容器,说白了就是已经序列化的json格式数据。
每个hash可存储4294967295个键值对
提供了,增/删/改/查,它和String类型命令开头多一个”h”
单条增加语法:
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
结果:
数据库:
删除表里某条记录语法
hdel hashName key [key …]
可单条删除也可多条删除,返回被删除的个数
删除哈希表语法
del hashName
将整个哈希表都删除
输入:hdel test country add
结果:
数据库:只余sex数据
4.3.1 直接覆盖值使用新增加命令,保证key一样即可
4.3.2 修改数值
语法:
hincrby hashName num(增加值)
hincrby表示为某个属性增加数字
例子
输入:hincrby test age 1
输出:
哈希数据结构没有支持字符串的追加以及减少的命令,减少数值的命令可用增加命令模拟,如下:
hincrby test age -1
查找数据语法:
hget hashName key
语法
hexists hashName key
hexists判断myhash中的username属性的值是否存在,存在就返回1,不存在就返回0;和结果是1
语法
hlen hashName
例子
输入:hlen test
结果:
所有keys:hkeys hashName
所有values:hvals hashName
语法
lpush listName str1 [str2 …]
lpush表示从左侧向链表中添加数据,返回成功插入的数量。
例如
输入:hlist testList 1 2 3 4 5 6 a b c d e f
结果:
数据库:
以字符串集合形势保存存储的数据
语法
lpushx listName str1 [str2 …]
输入:linsert testList before d befored
数据库:
成功在b元素前插入元素。
输入:linsert testList after d afterd
数据库:
成功在b元素后插入元素。
语法
rpop listName
lpop表示从左边儿(队尾)弹出 ,它会返回并弹出指定的key所关联的链表中的第一个元素,也就是它的头部元素;如果您不存在就会返回nil,如果存在就会返回第一个元素;testlist中的第一个元素是1,所以1就会被弹出来,结果为:1
语法
lrem listName count value
该指令会删除count个值为value的元素; 如果count大于0则从头遍历;如果count小于0则从尾遍历;如果count等于0,删除链表中所有等于某个值的元素;
例如
value不存在情况
输入:lrem testList 1 999
结果:
由于集合里不存在值为999的,所以主删除失败。
value存在的情况
输入:lrem testList 1 f
结果:
返回成功删除的个数。
语法
lset listName
设置指定索引位置的值,索引号从0开始。
例如
输入:lset testList 0 9999
数据库:
语法
lrange listName startIndex endIndex
lrange表示查看链表, listName为想要查看的链表,后面的为从startIndex开始到endIndex结束;可以从0开始计数,也可以从负数开始计数,如果是-1表示是链表尾部的元素;-2则表示倒数第二个元素;
正常范围,输入:lrange testList 0 2
结果:
负数,输入:lrange testList 0 -1
结果:
如果是-1表示是链表尾部的元素;-2则表示倒数第二个元素
语法
llen listName
输入:llen testList
结果:
如果是不存在的表会怎样
输入:llen pp
结果:
语法:rpoplpush list1 list2
从list1队头弹出一个元素插入到list2队尾
这个功能常用于消息队列的消息服务,完成多个程序之间的消息交互;
假设一个应用程序正在使用lpush向链表中添加新的元素,通常将这样的程序称为生产者,另一个程序正在使用rpop操作,从链表中取出元素,称为消费者;消费者程序在取出元素后崩溃,由于该消息已经被取出且没有被正常处理,我们认为这个消息已经丢失了,由此可能导致业务数据的丢失,或者导致业务状态的不一致等现象的发生,可以通过rpop,lpush这个命令,消费者程序在主消息队列中取出元素之后,再将它插入到一个备份的队列中,直到消费者程序完成正常的逻辑处理后,再讲消息从备份队列中删除,这样的话,我们可以提供一个守护的线程,当发现备份消息队列过期的时候,可以重新将它放到主消息的队列中,以便其他的消费者可以继续去处理;
最后二种数据结构体是:Set和Sorted-set它和java上Set概念是一样的,不允许重复,无序等等,你想想我们在写java程序里会经常使用到Set集合类吗,所以这里就不介绍Set数据结构体了,需要时再查询也不迟。
语法
keys *
语法
keys test*
语法
del key [key …]
语法
exist key
语法
rename oldley newKey
expire key time
ttl key
注意:如果没有设置key的超时时间,就会返回-1;
语法
type key
查看key的类型;比如:string,list,hash,set,sorted-set
PS:
技术的学习一定要细心一点,多提问