勿以浮沙筑高台
Redis基础准备
安装Redis
下载地址Github:
https://github.com/tporadowski/redis/releases 5.0
百度云:https://pan.baidu.com/s/1AlrZwsMaGqRJavako13bqQ
密码:85er
直接双击安装即可,安装完成后没有密码,直接通过端口6379访问就OK
Redis Desktop Manager可视化工具
下载地址:https://pan.baidu.com/s/1-MCHNe8DKFwk4A7wO-C_NQ
密码:8dbw
直接下载好,点击左下角connect to Redis Server ,输入Host地址和port端口链接。
Redis基础知识
- Redis是基于内存的运行数据库,所以肯定会发生数据丢失,断电。
- Redis所有数据存储都是key-value1存储
- Redis默认有16个库,在conf中databases 16标签可以配置库
4.Redis是非关系性数据库,因此是无法像SQL那样进行访问
5.Redis提供了多种数据结构来访问key-value,它们分别是:String,List,Hash,Zset,Set
Redis基础操作
Redis的启动
-
启动Redis服务: 首次需要启动cmd命令界面执行命令进行运行,打开cmd 使用cd 切换到redis目录,输入redis-server.exe redis.windows.conf运行redis。
-
启动客户端: 启动cmd命令界面。输入redis-cli.exe 弹出127.0.0.1:6379> 表示启动成功
Redis的基本操作命令
1.切换redis数据库 SELECT index
127.0.0.1:6379> SELECT 1 #index 代码库号。
OK
2.设置节点 set keyname context
127.0.0.1:6379[1]> set keyname context
OK
3.查询所有数据节点 keys *
127.0.0.1:6379[1]> keys *
1) "keyname"
2) "name"
4.判断节点是否存在,返回1代表存在,0代表失败
127.0.0.1:6379[1]> exists name
(integer) 1
5.把key往指定库中移动
127.0.0.1:6379[2]> move name 1 #移动name节点到1库
(integer) 1
127.0.0.1:6379[2]> select 1 #操作1库
OK
127.0.0.1:6379[1]> keys name #查询name节点
1) "name"
6.获得节点内容
127.0.0.1:6379[1]> get name
"132"
7.重置节点内容
27.0.0.1:6379[1]> set name context #如果有空格需要用""标注
OK
127.0.0.1:6379[1]> get name
"context"
7.设置key的过期时间,单位是秒
127.0.0.1:6379[1]> expire name 3 #3是描述
(integer) 1
127.0.0.1:6379[1]> get name
(nil)
8.查看当前key的剩余过期时间
127.0.0.1:6379> ttl name # 查看当前key的剩余过期时间
(integer) 7
127.0.0.1:6379> ttl name
(integer) -2 #返回-2表示节点已经不存在
9.清空数据库
127.0.0.1:6379> flushdb # 请空当前数据库
“OK”
127.0.0.1:6379> flushall # 请空所有数据库
“OK”
String数据结构(字符串)
1.设置值
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1
"v1"
2.最加值
127.0.0.1:6379[1]> append fuchasheng context
(integer) 7
127.0.0.1:6379[1]> get fuchasheng
"context"
3.获取字符串长度
127.0.0.1:6379> strlen fuchasheng # 获取字符串长度
(integer) 7
4.自增
127.0.0.1:6379[1]> set name 1
OK
127.0.0.1:6379[1]> incr name
(integer) 2
5.自减
127.0.0.1:6379[1]> decr name
(integer) 1
6.设置增长数
127.0.0.1:6379[1]> incrby name 3
(integer) 4
7.设置减数
127.0.0.1:6379[1]> decrby name 2
(integer) 2
8.设置特殊符号
127.0.0.1:6379[1]> set fu "hello,world"
OK
127.0.0.1:6379[1]> get fu
"hello,world"
9.截取字符串
127.0.0.1:6379[1]> getrange fu 0 3 #包含了0和3,意思包含2端截取
"hell"
10.获取全部字符串
127.0.0.1:6379> getrange fu 0 -1 # 获取全部的字符串,和 get key一样
"hello,world!"
11.替换
127.0.0.1:6379[1]> setrange fu 1 xx #从第二位开始,也可以看做从0开始
(integer) 11
127.0.0.1:6379[1]> get fu
"hxxlo,world"
12.setex设置过期时间
127.0.0.1:6379> setex key3 30 "hello" # 设置 30 秒后过期
OK
13.当不存在的时候创建节点,分布式节点使用
setnx mykey "redis" # mykey 不存在时设置成功
(integer) 1 # 返回0时代表节点已经存在
14.同时设置多个节点
127.0.0.1:6379[1]> mset k1 v1 k2 v2 k3 v3 #key是节点,v是context
OK
127.0.0.1:6379[1]> keys *
1) "keyname"
2) "k1"
3) "fuchasheng"
4) "fu"
5) "k3"
6) "k2"
7) "name"
15.同时获取多个节点值
127.0.0.1:6379[1]> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
16.原子操作设置节点
127.0.0.1:6379[1]> msetnx k5 v5 k4 v4 #原子操作一个失败所有失败。
(integer) 1
127.0.0.1:6379[1]> mget k4 k5
1) "v4"
2) "v5"
17.设置对象
127.0.0.1:6379[1]> mset user:1:name zhangsan user:1:age 2 #这里的User:1代码1号实例对象
OK
18.拿取对象
127.0.0.1:6379[1]> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
19.拿取原先的值再设置新值
127.0.0.1:6379[1]> getset k5 mongodb
"v5"
127.0.0.1:6379[1]> get k5
"mongodb"
总结:String 的使用场景:value 除了是字符串以外还可以是数字
计数器
统计多单位的数量
粉丝数
对象缓存存储
List数据结构(列表)
在 Redis 中可以把 list 用作栈、队列、阻塞队列。
list 命令多数以 l 开头。
1.先进后出队列,栈
127.0.0.1:6379[1]> lpush list one two three # 将一个值或者多个值,插入到列表的头部(左) 表 现为栈
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # 查看全部元素
1) "three"
2) "two"
3) "one"
2.通过区间获取值
127.0.0.1:6379> lrange list 0 1 # 通过区间获取值
1) "three"
2) "two"
3.将值从右侧插入
127.0.0.1:6379[1]> rpush list right
(integer) 4
127.0.0.1:6379[1]> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
4.移除左侧第一个元素
127.0.0.1:6379[1]> lpop list
"three"
5.移除右侧第一个元素
127.0.0.1:6379[1]> rpop list
"right"
6.通过索引查询所有
127.0.0.1:6379[1]> lrange list 0 -1 #通过索引查询所有
1) "two"
2) "one"
127.0.0.1:6379[1]> lindex list 1 #通过索引查询单个
"one"
6.通过内容移除节点
127.0.0.1:6379[1]> lrem list 1 two #移除内容为two的节点,如果有多个相同内容的会一同移除掉
(integer) 1
127.0.0.1:6379[1]> lrange list 0 -1
1) "one"
7.截取start和end之间的内容
127.0.0.1:6379[1]> lpush list hjk2 hjk3 hjk4 hjk5
(integer) 6
127.0.0.1:6379[1]> lrange list 0 -1
1) "hjk5"
2) "hjk4"
3) "hjk3"
4) "hjk2"
5) "hjk"
6) "one"
127.0.0.1:6379[1]> ltrim list 1 2
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "hjk4"
2) "hjk3"
8.移除列表的最后一个元素,将他移动到新的列表中。
127.0.0.1:6379[1]> lpush list hjk1 hjk2 hjk3 hjk4 hjk5 #新建list列表
(integer) 5
127.0.0.1:6379[1]> lrange list 0 -1 #查看
1) "hjk5"
2) "hjk4"
3) "hjk3"
4) "hjk2"
5) "hjk1"
127.0.0.1:6379[1]> rpoplpush list myotherlist #移除列表的最后一个元素,将他移动到新的列表中。
"hjk1"
127.0.0.1:6379[1]> lrange list 0 -1 #查看list
1) "hjk5"
2) "hjk4"
3) "hjk3"
4) "hjk2"
127.0.0.1:6379[1]> lrange myotherlist 0 -1 #查看myotherlist
1) "hjk1"
9.更新当前下标的值
127.0.0.1:6379[1]> lset list 0 item
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "item"
2) "hjk4"
3) "hjk3"
4) "hjk2"
10.将某个具体的value插入到列表中某个元素的前面或者后面
127.0.0.1:6379[1]> linsert list before "item" hello #插入item之前
(integer) 5
127.0.0.1:6379[1]> linsert list after "item" ohhhh #插入item之后
(integer) 6
127.0.0.1:6379[1]> lrange list 0 -1
1) "hello"
2) "item"
3) "ohhhh"
4) "hjk4"
5) "hjk3"
6) "hjk2"
总结:
list 实际上是一个链表,前后都可以插入
如果移除了所有的值,空链表,也代表不存在
在两边插入或者改动值,效率最高。
Set 数据结构(集合)
redis中的Set和List集合类似,集合中的value元素不可重复。集合之间可以取交集,并集,差集等。
1.向Set集合中添加元素
127.0.0.1:6379[1]> sadd myset "hello"
(integer) 1
2.查看Set集合中的元素
127.0.0.1:6379[1]> smembers myset
1) "hello"
3.判断某一个值是不是在set中
127.0.0.1:6379[1]> sismember myset hello # 判断某一个值是不是在set中
(integer) 1
4.获取集合中的个数
127.0.0.1:6379[1]> scard myset # 获取集合中的个数
(integer) 2
5.移除元素
127.0.0.1:6379[1]> srem myset hello # 移除元素
(integer) 1
6.随机抽取一个元素
127.0.0.1:6379[1]> srandmember myset #随机抽取一个元素
"hello"
7.随机抽取指定个数的元素
127.0.0.1:6379[1]> srandmember myset 2
1) "hello2"
2) "hello1"
6.随机删除一个元素
127.0.0.1:6379[1]> spop myset
"hello4"
127.0.0.1:6379[1]> smembers myset
1) "hello3"
2) "hello1"
3) "hello"
4) "hello2"
127.0.0.1:6379[1]> spop myset 5 #随机删除一个元素
"hello4"
7.将特定的值移动到指定Set集合,如果没有这个集合就会创建新集合
127.0.0.1:6379[1]> smove myset myset2 "hello"
(integer) 1
127.0.0.1:6379[1]> smove myset myset2 "hello2"
(integer) 1
127.0.0.1:6379[1]> smembers myset2
1) "hello2"
2) "hello"
8.交并差集
127.0.0.1:6379> smembers key1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sdiff key1 key2 # 差集
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2 # 交集
1) "c"
127.0.0.1:6379> sunion key1 key2 # 并集
1) "e"
2) "a"
3) "c"
4) "d"
5) "b"
总结
本质就是String一样的的,通过hash计算内存地址
key不能相同 常用于取重场景,比如计算邀请码生成了多少,多人参加的计算。
ZSet 数据结构(排序集合)
1.添加数据,其中,123呆在则数据在位置score
127.0.0.1:6379[1]> zadd myzset 3 one 2 two 1 three
(integer) 3
127.0.0.1:6379[1]> zrange myzset 0 -1 #查看数据
1) "three"
2) "two"
3) "one"
2.通过设置的score从小到大排序,注意这里的three和one的score我换了,所以效果是反的
127.0.0.1:6379[1]> zrangebyscore myzset -inf +inf
1) "three"
2) "two"
3) "one"
3.通过设置的score从大到小排序,注意这里的three和one的score我换了,所以效果是反的
127.0.0.1:6379[1]> zrevrange myzset 0 -1
1) "one"
2) "two"
3) "three"
4.带score输出
127.0.0.1:6379[1]> zrangebyscore myzset -inf +inf withscores
1) "three"
2) "1"
3) "two"
4) "2"
5) "one"
6) "3"
5.score小于等于2的value
127.0.0.1:6379[1]> zrangebyscore myzset -inf 2 withscores
1) "three"
2) "1"
3) "two"
4) "2"
6.# 移除特定元素
127.0.0.1:6379[1]> zrem myzset two
(integer) 1
127.0.0.1:6379[1]> zrevrange myzset 0 -1
1) "one"
2) "three"
7.获取有序集合的个数
127.0.0.1:6379[1]> zrangebyscore myzset -inf +inf withscores
1) "three"
2) "1"
3) "one"
4) "3"
5) "two"
6) "5"
127.0.0.1:6379[1]> zcard myzset
(integer) 3
7.获取指定score区间的个数
127.0.0.1:6379[1]> zcount myzset 1 3
(integer) 2
Hash数据结构(哈希)
也是 key - value 形式的,但是value 是一个map。
想到于value又是一个key - value
1.创建和查看
127.0.0.1:6379[1]> hset myhash field xxx #myhash为第一个key field为字段
(integer) 1
127.0.0.1:6379[1]> hget myhash field #获取field字段的值
"xxx"
127.0.0.1:6379> hmset myhash field1 hello field2 world # set 多个 key-value
OK
127.0.0.1:6379> hmget myhash field field1 field2 # 获取多个字段值
1) "xxx"
2) "hello"
3) "world"
2.获取全部的数据
127.0.0.1:6379> hgetall myhash
1) "field" #failed
2) "xxx" #failed-value
3) "field1" #failed
4) "hello" #failed-value
5) "field2" #failed
6) "world" #failed-value
3.删除指定的key
127.0.0.1:6379> hdel myhash field1 # 删除指定的key,对应的value也就没有了
(integer) 1
4.获取长度
127.0.0.1:6379> hlen myhash
(integer) 2
5.判断指定key是否存在
127.0.0.1:6379> hexists myhash field1
(integer) 0
6.获取所有的key
127.0.0.1:6379> hkeys myhash
1) "field"
2) "field2"
7.获取所有的value
127.0.0.1:6379> hvals myhash
1) "xxx"
2) "world"
8.如果不存在则新建节点,存在则不新建
127.0.0.1:6379> hsetnx myhash field4 hello
(integer) 1
9.如果failed-value是数字,新增和删减
127.0.0.1:6379> hincrby myhash field3 1 # 指定增量
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
总结
String :一个key对应一个value
List:链表,一个key对应多个value,先进后出,栈模型
Set:map模型,一个key对应多个value,但是value不具有排序且不能重复,但是可以取交并差
Zset:带有score排序的map模型,一个key对应多个value,但是value不具有排序且不能重复不可以取交并差,但是能排序。
Hash:key-failed-value,一个key对应多个failed,每个failed对应一个数据存储,