Redis学习指南

简介

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis是一个高性能的key-value数据库,遵守 BSD 协议。

特性:

  1. 支持数据持久化,可以将内存中的数据保存在磁盘
  2. 支持master-slave模式的数据备份
  3. 支持复杂数据类型并且提供对他们的原子性操作。例如 list,set,zset,hash等

安装

window下载地址:https://github.com/dmajkic/redis/downloads。

redis-server.exe redis.conf
redis-cli.exe -h 127.0.0.1 -p 6379

Redis 配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。通过 CONFIG 命令查看或设置配置项

//查看所有配置项
config *

Redis数据结构

字符串(String)

string就redis基本的类型,可以理解成与Memcached一模一样的类型,一个key对应一个value。一个键最大能存储512MB

string类型是二进制安全的。也就是说redis的string可以包含任何数据。比如jpg图片或者序列化的对象

哈希(Hash)

Redis Hash是一个键值对集合。是一个string类型的field和value的映射表,Hash特别适合用于存储对象。每个 Hash 可以存储 2^32 - 1 个键值对(40多亿)

列表(List)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。列表最多可存储 2^32 - 1 元素(4294967295, 每个列表可存储40多亿)

集合(Set)

Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)

有序集合(ZSet)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

//
zadd 键值 score 分数值
//
zrangebyscore myZsets 0 100000

Redis命令

启动redis客户端。输入命令 redis-cli

远程服务器执行命令

redis-cli -h 主机 -p 端口号 -a 密码

//用法
redis-cli -h 127.0.0.1 -p 6379 -a "mypass"

Redis 字符串常用命令

set key value:设置指定key的值为value。

get key:获取指定的key值。

127.0.0.1:6379> set username aitao
OK
(0.86s)
127.0.0.1:6379> get username
"aitao"							

getrange key start end:截取key字符串中的 【start,end】 范围的子串并返回。end等于-1时表示倒数第1个字符,-2表示倒数第2个字符,依次类推。

127.0.0.1:6379> getrange username 0 2
"ait"
127.0.0.1:6379> getrange username 0 -1
"aitao"
127.0.0.1:6379> getrange username 0 -2
"aita"

mset key1 value1 key2 value2 ... keyN valueN:同时设置一个或多个key-value值。

msetnx key1 value1 key2 value2 ... keyN valueN若所有给定 key 都不存在时,同时设置一个或多个 key-value值。

mget key1 key2 ... keyN:获取一个或多个指定的key的值。

127.0.0.1:6379> mset user root psd 123456 url www.aliyun-lam.cn
OK
127.0.0.1:6379> mget user psd url
1) "root"
2) "123456"
3) "www.aliyun-lam.cn"
#因为user键已经存在,所以设置失败
127.0.0.1:6379> msetnx driver com.mysql.jdbc.Driver user aitao 
(integer) 0
#driver未被设置成功
127.0.0.1:6379> exists driver
(integer) 0
#user键未被修改
127.0.0.1:6379> get user
"root"
127.0.0.1:6379>

setex key timeout value:为指定的 key 设置值及其过期时间。如果 key 已经存在,将会替换旧的值。

127.0.0.1:6379> setex age 20 18
OK
#3秒后
127.0.0.1:6379> ttl age 
(integer) 17
127.0.0.1:6379> get age
"18"
#17秒后
127.0.0.1:6379> ttl age
(integer) 3
127.0.0.1:6379> get age 
(nil)

setnx key value只有在 key 不存在时,才为key设置为value值。

127.0.0.1:6379> get username
"aitao"
#username键已经存在,操作失败
127.0.0.1:6379> setnx username lml
(integer) 0
127.0.0.1:6379> get username
"aitao"
#account键不存在,执行成功
127.0.0.1:6379> setnx account aitao
(integer) 1
127.0.0.1:6379> get account
"aitao"

getset key value:将指定的key值设置成value,并返回修改前的value值。当 key 不存在时,返回 nil

127.0.0.1:6379> get username
"aita-age"
#返回修改前的value值
127.0.0.1:6379> getset username lml
"aita-age"
127.0.0.1:6379> get username
"lml"
#ator键不存在,返回nil
127.0.0.1:6379> getset ator aitao
(nil)

setrange key offset value:从偏移量offset开始,用value值覆盖给定 key 所储存的字符串值。

127.0.0.1:6379> get username
"aitao"
127.0.0.1:6379> setrange username 4 -age
(integer) 8
127.0.0.1:6379> get username
"aita-age"

strlen key:返回 key 存储的字符串值的长度

127.0.0.1:6379> strlen username
(integer) 5
#键不存在时,strlen命令返回0
127.0.0.1:6379> strlen name
(integer) 0

incr key:将 key 中储存的数字值增1

incrby key increment:将 key 所储存的值加上给定的增量值(increment)。

incrbyfloat key increment:为 key 中所储存的值加上指定的浮点数增量值(increment)。

127.0.0.1:6379> set count 1
OK
#返回自增后的值
127.0.0.1:6379> incr count
(integer) 2
#若操作的key的值不能表示为数字,那么返回一个错误
127.0.0.1:6379> incr username
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrby count 10
(integer) 12
#数字值在Redis中以字符串的形式保存
127.0.0.1:6379> get count
"12"
#可以通过该命令添加小数值
127.0.0.1:6379> incrbyfloat count 1.111
"13.111000000000001"
#若key不存在,incr,incrby,incrbyfloat会将key的值设为0,在进行自增
127.0.0.1:6379> incrbyfloat count2 2
"2"
127.0.0.1:6379> incr count3
(integer) 1
127.0.0.1:6379> incrby count4 10
(integer) 10

decr key:将 key 中储存的数字值减 1。

decr key decrement:将 key 所储存的值加上给定的差值(decrement)。

127.0.0.1:6379> decr count
(integer) 0
127.0.0.1:6379> decrby count 10
(integer) -10

append key value:如果 key 已经存在并且是一个字符串, append命令会将 value 追加到 key 原来的值的末尾。

127.0.0.1:6379> get username
"lml"
#追加字符串,返回追加后字符串的长度
127.0.0.1:6379> append username -aitao
(integer) 9
127.0.0.1:6379> get username
"lml-aitao"
#若追加的key不存在,则append命令等同于set命令
127.0.0.1:6379> append username2 aitao
(integer) 5

Redis 哈希常用命令

hsetnx key filed value:设置hash表key的field字段的值为value。若filed字段存在则操作无效。

hset key filed value:设置hash表key的field字段的值为value。

hmset key filed1 value1,field2 value2,...,fieldN valueN:设置一个或多个 filed-value 域值对到hash表key中

hget key filed:获取hash表key中的filed字段的值。

hmget key filed1,filed2,...,filedN:获取hash表key中指定的一个或多个filed字段的值。

127.0.0.1:6379> hmset myhash name aitao age 18 sex M
OK
127.0.0.1:6379> hmset myhash birthday 19990421
OK
127.0.0.1:6379> hget myhash birthday
"19990421"
127.0.0.1:6379> hsetnx myhash birthday 19980506
(integer) 0 #birthday字段存在,操作无效
127.0.0.1:6379> hmget myhash name sex
1) "aitao"
2) "M"

hlen key:获取hash表key的filed字段的数量。

getall key:获取hash表key中所有的 filed-value 域值对。

hkeys key:获取hash表key中的所有字段。

hvals key:获取hash表key中的所有值。

127.0.0.1:6379> hlen myhash
(integer) 4
127.0.0.1:6379> hgetall myhash
1) "name"
2) "aitao"
3) "age"
4) "18"
5) "sex"
6) "M"
7) "birthday"
8) "19990421"
127.0.0.1:6379> hkeys myhash
1) "name"
2) "age"
3) "sex"
4) "birthday"
127.0.0.1:6379> hvals myhash
1) "aitao"
2) "18"
3) "M"
4) "19990421"

hexists key filed:判断hash表key中指定的字段是否存在。若表中不包含字段,或hash表 key不存在返回 0;否则返回1 。

127.0.0.1:6379> hexists myhash account
(integer) 0
127.0.0.1:6379> hexists myhash name
(integer) 1
127.0.0.1:6379> hexists myhash2 name
(integer) 0

hdel key filed1,filed2,...,fieldN:删除hash表key中一个或多个指定字段,不存在的字段将会忽略。返回被删除字段的数量。

#hash表中不存在的字段,name2,name3将会被忽略
127.0.0.1:6379> hdel myhash name name2 name3 age sex
(integer) 3 #返回被删除的字段数

hincrby key field increment :为哈希表key中的field字段的整数值加上增量 increment。

hincrbyfloat key field increment:为哈希表key中的指定字段的浮点值加上增量 increment。

127.0.0.1:6379> hincrby myhash count 10
(integer) 11
127.0.0.1:6379> hincrby myhash count -2
(integer) 9
127.0.0.1:6379> hincrbyfloat myhash floatCount 3.4
"4.5"
127.0.0.1:6379> hincrbyfloat myhash floatCount -1.3
"3.2"

Redis 列表常用命令

lpush key val1,...,valN:将一个或多个值插入到列表头部。

rpush key val1,...,valN:将一个或多个值插入到列表的尾部。

lpushx key val1,...,valN:将一个或多个值插入到已存在的列表头部。若列表不存在,操作无效。

rpushx key val1,...,valN:将一个或多个值插入到已存在列表的尾部。若列表不存在,操作无效。

lpop key:移出并获取列表key的第一个元素

rpop key:移除并获取列表key的最后一个元素

lrange key start end获取列表key【start,end】范围内的元素,end等于-1时,表示获取倒数第一个元素,依次类推。

llen key:获取列表key的长度

#向头部添加值,若key不存在,则先创建,在添加元素
127.0.0.1:6379> lpush mylist a b c
(integer) 3
#向尾部添加值,若key不存在,则先创建,在添加元素
127.0.0.1:6379> rpush mylist d e f
(integer) 6
127.0.0.1:6379> lpushx mylist0 "a"
(integer) 0 #mylist0列表不存在,操作无效
127.0.0.1:6379> rpushx mylist0 "b"
(integer) 0 #mylist0列表不存在,操作无效
#遍历列表
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
#弹出头部值,并返回被弹出的值
127.0.0.1:6379> lpop mylist
"c"
#弹出尾部值,并返回被弹出的值
127.0.0.1:6379> rpop mylist
"f"
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "a"
3) "d"
4) "e"
#获取列表长度
127.0.0.1:6379> llen mylist
(integer) 2

lset key index value设置列表指定索引元素的值;当索引参数超出范围,或对一个空列表进行 lset 时,返回一个错误。

lindex key value根据索引值获取列表 key 中的元素。索引从 0 开始

127.0.0.1:6379> lrange mylist 0 -1
1) "d"
2) "aitao"
127.0.0.1:6379> lset mylist 0 lml
OK
# 索引值大于列表个数
127.0.0.1:6379> lset mylist 2 aitao
(error) ERR index out of range
# 索引从0开始
127.0.0.1:6379> lindex mylist 0
"lml"
127.0.0.1:6379> lindex mylist 1
"aitao"
127.0.0.1:6379> lindex mylist 2
(nil)

linsert key before|after exist_val new_val :在列表key中指定元素前或者后插入元素。


ltrim key start end:保留指定区间 【start,end】的元素。删除不在指定区间的元素。

#保留[0,3]区间内的元素
127.0.0.1:6379> ltrim mylist2 0 3
OK
127.0.0.1:6379> lrange mylist2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"

blpop key1 key2...keyN timeout:移出并获取列表的第一个元素。如果列表没有元素,会阻塞列表直到等待超时或发现可弹出元素为止。若列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值

brpop key1 key2...keyN timeout:移出并获取列表的最后一个元素, 如果列表没有元素,会阻塞列表直到等待超时或发现可弹出元素为止。如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

127.0.0.1:6379> lrange mylist2 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush mylist3 4 5 6
(integer) 3
127.0.0.1:6379> lrange mylist3 0 -1
1) "4"
2) "5"
3) "6"
#弹出列表mylist2中的头部元素3
127.0.0.1:6379> blpop mylist2 mylist3 1000
1) "mylist2"
2) "3"
#弹出列表mylist3中的头部元素4
127.0.0.1:6379> blpop mylist3 mylist2 1000
1) "mylist3"
2) "4"
#弹出列表mylist2中的尾部元素1
127.0.0.1:6379> brpop mylist2 1000
1) "mylist2"
2) "1"
#弹出列表mylist3中的尾部元素6
127.0.0.1:6379> brpop mylist3 1000
1) "mylist3"
2) "6"
#若列表mylist2存在数据则会返回头部元素,否则在等待10秒后会返回 nil
127.0.0.1:6379> blpop mylist2 10
(nil)
(10.03s)

lrem key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素;

  • count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
  • count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
  • count = 0 : 移除表中所有与 value 相等的值。
127.0.0.1:6379> lpush mylist2 a b c d e f a a d e e c
(integer) 12
#从左往右搜索,删除1个value值为a的元素
127.0.0.1:6379> lrem mylist2 1 a
(integer) 1
127.0.0.1:6379> lrange mylist2 0 -1
 1) "c"
 2) "e"
 3) "e"
 4) "d"
 5) "a"
 6) "f"
 7) "e"
 8) "d"
 9) "c"
10) "b"
11) "a"
#从右往左搜索,删除 |-3| 个value值为e的元素
127.0.0.1:6379> lrem mylist2 -3 e
(integer) 3
127.0.0.1:6379> lrange mylist2 0 -1
1) "c"
2) "d"
3) "a"
4) "f"
5) "d"
6) "c"
7) "b"
8) "a"
#删除所有value值为a的元素
127.0.0.1:6379> lrem mylist2 0 a
(integer) 2
127.0.0.1:6379> lrange mylist2 0 -1
1) "c"
2) "d"
3) "f"
4) "d"
5) "c"
6) "b"

brpoplpush source destination timeout:从列表中key弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

rpoplpush source destination:移除列表的最后一个元素,并将该元素添加到另一个列表并返回

Redis 通用命令

keys *:获取所有的键值

type key:获取键对应的值类型

del key:删除指定的键值

select dbIndex:选择数据库。dbIndex的取值为 0 ~ 15

move key dbIndex:将当前数据库中的 key 转移到 dbIndex 库中

dbsize:返回当前数据库中的 key 的数量

flushall:清空数据库中的所有 key值

expire key seconds:设置一个 key 的过期时间为seconds秒

ttl key:查询已设置过期时间的 key 的剩余时间。若返回 -2 表示该键值对已经被删除,返回-1过期时间表示被移除

persist key:移除指定 key 的过期时间(-1代表缓存已失效)

在这里插入图片描述

持续学习中…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所幸你是例外

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值