redis数据库的使用
一、安装
-
下载-----打开redis官方网站,推荐下载稳定版本(stable)
wget https://download.redis.io/releases/redis-6.2.1.tar.gz
-
解压
tar -zxvf redis-6.2.1.tar.gz
-
改名并移动到/usr/local目录下(推荐)
sudo mv redis-6.2.1 redis sudo mv ./redis /usr/local/
-
编译安装
cd /usr/local/redis make && sudo make install
二、配置
/usr/local/redis目录下,文件redis.conf为配置文件
- 需要远程访问,可将此行注释:
bind 127.0.0.1
- 默认端口:6379,可以修改
port 6379
- 是否以守护进程运行
daemonize no|yes
如果以守护进程运行,则不会堵塞命令行,否则当前终端被阻塞,推荐设为yes
- 数据文件名
dbfilename dump.rdb
数据库中添加键值后,会发现在当前运行的目录下创建了一个文件:dump.rdb,这个文件用于将数据持久化存储
- 数据文件存储路径
dir ./ #推荐修改为 dir /var/lib/redis/
三、运行
- 修改配置文件存放目录
sudo mkdir /etc/redis sudo cp /usr/local/redis/redis.conf /etc/redis/redis.conf
一般配置文件都存放在/etc/目录下
- 配置文件启动(方式一)
sudo redis-server /etc/redis/redis.conf
直接运行redis-server会阻塞当前终端
- 后台启动服务(方式二)
redis-server & #执行命令后,按两下回车键
- 关闭服务
ps -aux | grep redis sudo kill -9 进程号(pid)
- 启动redis客户端
redis-cli
四、数据库以及键的命令
-
数据库命令
切换数据库select 数据库名 #0-15共16个数据库,默认数据库为0
- 清空当前数据库
flushdb
键命令
-
查找键
keys pattern keys * #查找所有 keys n* #查找以n开头的键
exists key [key ...]
不存在就返回0,如果判断多个,则返回存在的个数,比如判断3个键,只有2个存在,则返回2
type key
del key [key ...]
expire key seconds
创建时没有设置过期时间则一直存在,直到使用del移除
ttl key
五、数据操作
redis是key-value的数据,所以每个数据都是一个键值对
键的类型以及元素的类型均为字符串
值的类型可分为以下5种:
- [li]字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
string
string是redis最基本的类型,是二进制安全的,即可以为任何数据,比如数字、图片、序列化对象等,最大能存储512MB数据
设置:
- 设置键值
set key value
- 设置键值及过期时间,以秒为单位
setex key seconds value
- 设置多个键值
mset key value [key value ...]
获取:
- 根据键获取值,如果不存在此键则返回nil
get key
- 根据多个键获取多个值
mget key [key ...]
- 获取值长度
strlen key
运算:(值必须是数字)
- 键对应的值加1
incr key
- 值加整数
incrby key increment
- 值减1
decr key
- 值减整数
decrby key decrement
其他:
- 追加值
append key value
例如原有的键对应值是"hello",append key "world"后,值变成"helloworld"
hash
用于存储对象,对象的格式为键值对
设置:
- 设置单个属性
hset key field value
注:hset现在也能设置多个属性
- 设置多个属性
hmset key field value [field value ...]
获取:
- 获取单个属性的值
hget key field
- 获取多个属性的值
hmget key field [field ...]
- 获取所有属性以及值
hgetall key
- 获取所有属性
hkeys key
- 获取所有值
hvals key
- 获取属性个数
hlen key
- 获取某个属性值的长度
hstrlen key field
其他:
- 判断某个属性是否存在
hexists key field
- 删除属性和值
hdel key field [field ...]
list
列表的元素类型为string,在列表的头部或者尾部添加元素,按照插入顺序排序
设置:
- 头部插入数据
lpush key element [element ...]
如果插入多个数据,后插入的数据会在前面,比如lpush list1 'a' 'b' 'c',结果list1中的数据顺序是'c' ,'b', 'a'
- 尾部插入数据
rpush key element [element ...]
- 在指定元素的前面或者后面插入某个元素
linsert key BEFORE|AFTER pivot element
- 设置指定索引的元素值,索引从0开始,也可以使用负数,-1表示最后一个
lset key index element
获取:
- 移除并获取第一个元素
lpop key
- 移除并获取最后一个元素
rpop key
- 获取指定索引对应的元素
lindex key index
- 获取指定索引范围内的元素
lrange key start stop
- 获取列表长度
llen key
其他:
- 裁剪列表
ltrim key start stop
裁剪后,成为原列表的一个子集
set
无序集合,元素为string类型,具有唯一性,不重复
设置:
- 添加元素
sadd key member [member ...]
获取:
- 返回集合所有元素
smembers key
- 返回集合元素个数
scard key
其他:
- 交集
sinter key [key ...]
集合共有的部分
- 差集
sdiff key [key ...]
注意先后顺序,前面集合所独有的部分
- 合集
sunion key [key ...]
- 判断元素是否在集合中
sismember key member
zset
有序集合(sorted set),元素类型为string,具有唯一性,不重复,每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序,score值可以相同。
设置:
- 添加
zadd key score member [score member ...]
获取:
- 获取指定索引范围内的元素
zrange key min max
- 获取集合元素个数
zcard key
- 统计权重值在某一范围内的元素个数
zcount key min max
- 获取某一个元素的权重值
zscore key member
六、发布订阅
客户端发到频道的消息,将会被推送到所有订阅此频道的客户端。
客户端不需要主动去获取消息,只需要订阅频道,这个频道的内容就会被推送过来。
-
发布
publish channel message
-
订阅
subscribe channel [channel ...]
-
取消订阅
unsubscribe [channel [channel ...]]
如果不写参数,表示取消订阅所有频道
七、主从配置
一个主服务器可以拥有多个从服务器,一个从服务器又可以拥有多个从服务器,如此下去,形成了强大的多级服务器集群架构。
将ip为192.168.1.10的机器作为主服务器,将ip为192.168.1.11的机器作为从服务器,进行演示。
-
主服务器配置
bind 192.168.1.10
修改配置文件(/etc/redis/redis.conf文件)
-
从服务器配置
bind 192.168.1.11 slaveof 192.168.1.10 6379
注意:在slaveof后面写主机ip,再写端口,而且端口必须写
-
主服务器上写数据
set hello world
-
从服务器上读取数据
get hello
八、与python交互
-
安装redis包
sudo pip3 install redis
-
引入redis模块
import redis
-
创建数据库连接对象
try: r = redis.StrictRedis(host='ip地址',port=6379) except Exception as e: print(e)
-
数据库操作
方式一:根据数据类型,调用相应方法
#string类型演示 r.set(key,value) r.get(key) #注意返回的是bytes类型,没有则返回None #hash类型 r.hset(key,field,value) #设置单个属性和值,可以执行多次 r.hmset(key,{field1:value1,...}) #设置多个属性和值 r.hget(key,field) #获取单个属性的值 r.hgetall(key) #获取所有属性和值,dict类型 r.expire(key,seconds) #设置过期时间 r.hdel(key,field1,...) #删除属性和值 r.delete(key) #删除键,注意是delete而不是del
-
方式二:利用pipeline缓冲多条命令,然后一次性执行,减少服务器-客户端之间TCP数据库包,从而提高效率
pipe = r.pipeline() pipe.set(key1,value1) pipe.set(key2,value2) pipe.execute()
- NoSQL数据库:Redis内存使用优化与存储
- 关于使用key/value数据库redis和TTSERVER的心得体会
- Windows上使用C#访问ubuntu上的redis数据库
- NoSQL数据库:Redis内存使用优化与存储
- redis数据库的使用方法以及测试实例
- JAVA中使用redis+protoStuff实现数据库缓存机制
- 为什么要使用redis数据库?
- Python学习之使用Python操作Redis数据库
- 基于C#的MongoDB数据库开发应用(4)--Redis的安装及使用
- Redis和硬盘数据库一起使用好吗?
- 【数据库开发】windows下使用c++调用redis
- 深入理解Spring Redis的使用 (九)、通过Redis 实现 分布式锁 的 BUG,以及和数据库加锁的性能测试
- 详解JavaEE 使用 Redis 数据库进行内容缓存和高访问负载
- 在yii框架下使用redis数据库
- Spring Boot中使用Redis数据库
- 关于使用key/value数据库redis和TTSERVER的心得体会
- Redis数据库安装配置使用
- Redis数据库的使用场景介绍(避免误用Redis)
- 深入浅出Redis02 使用Redis数据库(String类型)
- 使用jedis 链接redis数据库