当前位置 : 主页 > 编程语言 > 其它开发 >

Redis基本使用

来源:互联网 收集:自由互联 发布时间:2022-05-30
一:概述 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 值(value)可以是 字符串(String), 哈希
一:概述

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

二:Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

2.1 基本语法
#存储键值对
127.0.0.1:6379> set name xiaowu
OK

#根据键获取值
127.0.0.1:6379> get name
"xiaowu"

#检查键是否存在
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists xiaowu
(integer) 0

#修改键的名称
127.0.0.1:6379> rename name newName
OK

#删除键
127.0.0.1:6379> del key
(integer) 1

#设置键的过期时间为 1 分钟
127.0.0.1:6379> expire newName 60
(integer) 1

#返回所有的键
127.0.0.1:6379> keys *
2.2 String(字符串)

string是 redis 最基本的类型,是二进制安全的。意思是 redis 的string可以包含任何数据。比如 jpg 图片或者序列化的对象,一个键最大能存储 512MB。
set和get操作

127.0.0.1:6379> set name xiaowu
OK
127.0.0.1:6379> get name
"xiaowu"

mset和mget操作

#同时设置一个或多个键值对
127.0.0.1:6379> mset key1 "hello" key2 "world"
OK
#获取多个值
127.0.0.1:6379> mget key1 key2
1) "hello"
2) "world"

incr和decr操作

# 将 key 中储存的数字值增一
127.0.0.1:6379> set a 20
OK
127.0.0.1:6379> incr a
(integer) 21
127.0.0.1:6379> get a
"21"
#将 key 中储存的数字值减一
127.0.0.1:6379> decr a
(integer) 20
127.0.0.1:6379> get a
"20"

应用场景
 1.用于控制数据库表主键id,为数据库表主键提供生成策略。
 2.redis控制数据的生命周期,通过数据是否失效控制业务行为。

2.3 哈希

hash 是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
基本操作

#同时将多个 field-value (字段-值)对设置到哈希表中
127.0.0.1:6379> hset myhash field1 "foo" field2 "bar"
(integer) 2
127.0.0.1:6379> hget myhash field1
"foo"
127.0.0.1:6379> hget myhash field2
"bar"
#删除哈希表 key 中的一个或多个指定字段
127.0.0.1:6379> hdel myhash field1
(integer) 1
127.0.0.1:6379> hdel myhash field2
(integer) 1
#获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "foo"
3) "field2"
4) "bar"
#获取所有哈希表中的字段
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "field2"
2.4 List列表

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素导列表的头部(左边)或者尾部(右边),底层采用的是双向链表的数据结构。列表最多可存储 232 - 1 元素。
基本操作

#添加元素
127.0.0.1:6379> lpush sql redis
(integer) 1
127.0.0.1:6379> lpush sql mongodb
(integer) 2
127.0.0.1:6379> lpush sql mysql
(integer) 3
#范围查询
127.0.0.1:6379> lrange sql 0 10
1) "mysql"
2) "mongodb"
3) "redis"
#移出并获取列表的第一个元素
127.0.0.1:6379> lpop sql
"mysql"
127.0.0.1:6379> rpop sql
"redis"

取最新的N个评论

127.0.0.1:6379> lpush mycomment 100001
(integer) 1
127.0.0.1:6379> lpush mycomment 100002
(integer) 2
127.0.0.1:6379> lpush mycomment 100003
(integer) 3
127.0.0.1:6379> lpush mycomment 100004
(integer) 4
127.0.0.1:6379> lrange mycomment 0 -1
1) "100004"
2) "100003"
3) "100002"
4) "100001"
2.5 SET集合

Set是string类型的无序集合,集合成员是唯一的,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
基本操作

#插入数据
127.0.0.1:6379> sadd nosql redis
(integer) 1
127.0.0.1:6379> sadd nosql mongodb
(integer) 1
127.0.0.1:6379> sadd nosql mysql
(integer) 1
127.0.0.1:6379> sadd nosql mysql
(integer) 0
#返回集合中的所有成员
127.0.0.1:6379> smembers nosql
1) "mysql"
2) "redis"
3) "mongodb"
#获取集合得成员数
127.0.0.1:6379> scard nosql
(integer) 3
#移除并返回集合中的一个随机元素
127.0.0.1:6379> spop nosql
"mysql"
#移除集合中的一个或多个成员元素
127.0.0.1:6379> srem nosql redis
(integer) 1

求共同好友

127.0.0.1:6379> sadd marong_friend 'songdan' 'wangsicong' 'songzhe'
(integer) 3
127.0.0.1:6379> SMEMBERS marong_friend
1) "songzhe"
2) "wangsicong"
3) "songdan"
127.0.0.1:6379> sadd wangbaoqiang_friend 'dengchao' 'angelababy' 'songzhe'
(integer) 3
127.0.0.1:6379> SMEMBERS wangbaoqiang_friend
1) "songzhe"
2) "dengchao"
3) "angelababy"
127.0.0.1:6379>  SINTER marong_friend wangbaoqiang_friend
1) "songzhe"
#推荐好友
127.0.0.1:6379> SDIFF marong_friend wangbaoqiang_friend
1) "wangsicong"
2) "songdan"
2.6 zset(sorted set:有序集合)

zset 和 set 一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
基本操作

zadd key score member
#添加元素,元素在集合中存在则更新对应score
127.0.0.1:6379> zadd xwkey 1 redis
(integer) 1
127.0.0.1:6379> zadd xwkey 1 mongodb
(integer) 1
127.0.0.1:6379> zadd xwkey 2 mysql
(integer) 1
127.0.0.1:6379> zadd xwkey 2 mysql
(integer) 0
#有序集成员按分数值递增(从小到大)次序排列
127.0.0.1:6379> zrange xwkey 0 10 withscores
1) "mongodb"
2) "1"
3) "redis"
4) "1"
5) "mysql"
6) "2"
#获取有序集合的成员数
127.0.0.1:6379> zcard xwkey
(integer) 3
#移除有序集中的一个成员
127.0.0.1:6379> zrem xwkey mongodb
(integer) 1
#移除有序集中的多个成员
127.0.0.1:6379> zrem xwkey redis mysql
(integer) 2
三:持久化 3.1 概述

由于redis是一个内存数据库,当 redis 服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘文件中。
持久化机制
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。目前Redis持久化的方式有两种:RDBAOF
  RDB:默认方式,不需要进行配置,默认就使用这种机制,在一定间隔时间中,检测 key 的变化情况,然后持久化数据。
  AOF:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据。
Redis在利用RDB和AOF进行恢复的时候,都会读取RDB或AOF文件,重新加载到内存中。

3.2 RDB

将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据。
按照一定的策略周期性的将数据保存到磁盘。对应产生的数据文件为dump.rdb,快照的周期通过配置文件中的save参数来定义。

dbfilename dump.rdb
save 900 1    #当有一条Keys数据被改变时,900秒刷新到Disk一次
save 300 10   #当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次

save的工作原理
 Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的。当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件。

3.3 AOF

数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程。使用AOF持久化方式时,Redis会将每一个收到的写命令都通过Write函数追加到文件中。
使用AOF的方式,在Redis重启时会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存,载入的速度相比于RDB慢一些。
开启 AOF
 在redis.conf中通过appendonly参数开启

appendonly no ---> appendonly yes

# appendfsync always   每一次都进行持久化,最慢但是保证完全的持久化,不推荐
appendfsync everysec   每隔一秒进行一次持久化,推荐
# appendfsync no       不持久化,不推荐

AOF的完全持久化方式同时也带来了另一个问题,持久化文件会变得越来越大。为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令。

四:数据备份与恢复

SAVE 命令用于创建当前数据库的备份。
数据备份
在 Redis 安装目录中创建 dump.rdb文件

127.0.0.1:6379> save
OK

数据恢复

redis 127.0.0.1:6379> CONFIG GET dir
五:Redis事务

事务可以一次执行多个命令,并且带有以下两个重要的保证:
  1.事务是一个单独的隔离操作(隔离性):事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2.事务是一个原子操作(原子性):事务中的命令要么全部被执行,要么全部都不执行。

#开启事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set book "JVM"
QUEUED
127.0.0.1:6379(TX)> get book
QUEUED
127.0.0.1:6379(TX)> sadd tag "C++" "Java" "PhP" "Python"
QUEUED
127.0.0.1:6379(TX)> smembers tag
QUEUED
#关闭事务
127.0.0.1:6379(TX)> exec
1) OK
2) "JVM"
3) (integer) 4
4) 1) "Python"
   2) "Java"
   3) "C++"
   4) "PhP"

其他命令

#取消事务,放弃执行事务块内的所有命令
discard

#取消 watch 命令对所有key的监视
unwatch

#监视一个或者多个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
watch key [key..]

注意
  1.当定义事务过程中,命令格式(语法)输入错误,整体事务中的所有命令均不会执行,包括那些正确的命令。
  2.当定义事务过程中,命令执行出错(格式正确,无法执行),能够正确运行的命令会执行,运行错误的命令不会被执行。
转钱案例

127.0.0.1:6379> set dengchao 60000
OK
127.0.0.1:6379> set wangbaoqiang 200
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby dengchao -10000
QUEUED
127.0.0.1:6379(TX)> incrby wangbaoqiang 10000
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 50000
2) (integer) 10200
小结

image

上一篇:接口
下一篇:没有了
网友评论