Redis
Posted xue_yun_xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。
一、非关系型数据库
非关系型数据库 nosql—>not only sql
行与行之间没有关系
表与表之间没有关系
- Redis就是一款NoSQL。key value
- NoSQL -> 非关系型数据库 -> Not Only SQL。
- Key-Value:Redis
- 文档型:ElasticSearch,Solr,Mongodb。。。 存储文档(文章)
- 面向列:Hbase,Cassandra。。。—>列存储数据库 (大数据相关数据库,列可以随时增加
- 图形化:Neo4j。。。 图数据库 描述的数 成员之间关系
除了关系型数据库都是非关系型数据库。
NoSQL只是一种概念,泛指非关系型数据库,和关系型数据库做一个区分。
关系型数据库:mysql,sqlserver,oracle
表中行与行之间没有直接关系,但是某些列(类型)有共同的地方 —》 select * from where type=1
表中某一行的一列 和另外一张表中的一行进行关联 —> select * from tb_a a left join tb_b b on a.x=b.y
二、Redis概述
Redis 是非关系型数据库,是key value 型数据库,类似 Map,但是功能 数据结构比Map 更加强大
- 特点
key value- 数据基于内存存储
- 使用c语言编写 (性能好)
- 读写速度快(110000/s读取数据以及81000/s写入数据 ,而mysql 8000-10000(基于磁盘存储))
- 支持持久化机制
- 支持 主从 集群 模式提供高可靠保证(重点)
三、Redis安装
1、单机安装
[root@mastera java2102]# mkdir docker-compose-redis01
[root@mastera java2102]# cd docker-compose-redis01/
[root@mastera docker-compose-redis01]# ls
[root@mastera docker-compose-redis01]# vim docker-compose.yaml
version: '3.1'
services:
redis:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis
environment:
- TZ=Asia/Shanghai
ports:
- 6379:6379
2、启动
[root@mastera docker-compose-redis01]# docker-compose up -d
3、查看redis
[root@mastera docker-compose-redis01]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
4、进入redis
[root@mastera docker-compose-redis01]# docker exec -it redis bash
root@b22bb6b1d2ff:/data# redis-cli
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> get a
"1"
5、客户端连接
四、Redis作用
redis是nosql数据库,缓存数据库。
作用:
- 用来存放热点数据(首页数据,热搜)
- 作为缓存使用(mybatis 二级缓存)
- 作为消息队列使用
- 分布式锁
五、Redis数据结构
Redis 就是键值对 key : value
value:
- String 普通的字符串
- hash (键值对) 类似map ,一般用户存储对象(对应java对象的属性 属性值)
- list(集合)有序 ,作为消息队列
- set (集合) 无序 ,不能重复 作用:去重
- zset 有序(有排名)的集合 放入的任何元素 都有分值,按照分值进行排序 用于排名
六、Redis命令
1、String命令
设置key value
127.0.0.1:6379> set c 3
获取值
127.0.0.1:6379> get c
批量设置值
127.0.0.1:6379> mset d 4 e 5
OK
批量获取
127.0.0.1:6379> MGET a b c d e
1) "1"
2) "2"
3) "30"
4) "4"
5) "5"
自增
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> get a
"2"
127.0.0.1:6379> incr a
(integer) 3
127.0.0.1:6379> get a
127.0.0.1:6379> incr b #如果自增的key 对应的值是 字符/字符串 不可以自增
(error) ERR value is not an integer or out of range
自减
127.0.0.1:6379>
127.0.0.1:6379> decr a
(integer) 1
127.0.0.1:6379> get a
"1"
自增 自定义步长(每次自增几个多少)
127.0.0.1:6379> INCRBY a 2
(integer) 3
127.0.0.1:6379> INCRBY a 2
(integer) 5
置key 存活时间 并设置值
127.0.0.1:6379> setex name 5 xiaoming
OK
127.0.0.1:6379> get name
"xiaoming"
127.0.0.1:6379> get name
(nil)
setnx
当key 不存在时 可以设置成功
当key 存在是则,什么都不做
作用:分布锁
当key 不存在时 可以设置成功 就相当于抢到了锁
当key 存在是则,什么都不做 就相当于 别人持有了锁,自己需要阻塞尝试设置成功 得到锁
127.0.0.1:6379> setnx luping 1
(integer) 1
127.0.0.1:6379> get luping
"1"
127.0.0.1:6379> set luping 1
OK
127.0.0.1:6379> set luping 2
OK
127.0.0.1:6379> get luping
"2"
127.0.0.1:6379> setnx luping 3
(integer) 0
127.0.0.1:6379> get luping
"2"
在为当前key 对应的 value 追加 (当前key 对应的数据结果 String )
127.0.0.1:6379> APPEND b cde
(integer) 4
127.0.0.1:6379> get b
"acde"
获取value 对应的长度
127.0.0.1:6379> STRLEN c
(integer) 2
2、hash命令
value 是hash数据结构
vauel存储 hashMap,实体类中的属性 属性值
student1(key)
(value)
name xiaoming
age 18
HSET key 属性值 值
hget key 属性值
127.0.0.1:6379> HSET student1 name xiaoming
(integer) 1
127.0.0.1:6379> HSET student1 age 18
(integer) 1
127.0.0.1:6379> hget student1 name
"xiaoming"
127.0.0.1:6379> hget student1 age
"18"
批量设置 批量获取
127.0.0.1:6379> hmset student1 sex F height 170
OK
127.0.0.1:6379> hmget student1 name age sex height
1) "xiaoming"
2) "18"
3) "F"
4) "170"
获取所有属性 及 属性值
127.0.0.1:6379> HGETALL student1
1) "name"
2) "xiaoming"
3) "age"
4) "18"
5) "sex"
6) "F"
7) "height"
8) "170"
获取 所有的 key 内部 value 的属性
127.0.0.1:6379> hkeys student1
1) "name"
2) "age"
3) "sex"
4) "height"
3、list 命令
list 是集合 ,是队列,有序 常作为 消息队列使用
从左侧向对队列添加内容
127.0.0.1:6379> lpush list1 a
(integer) 1
127.0.0.1:6379> lpush list1 b
(integer) 2
获取所有队列中的集合
127.0.0.1:6379> LRANGE list1 0 -1 #从 下标0 到最后一个
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LRANGE list1 0 1#从 下标0 下标 1
1) "c"
2) "b"
127.0.0.1:6379> LRANGE list1 0 2
1) "c"
2) "b"
3) "a"
从右边添加集合
127.0.0.1:6379> RPUSH list1 1
(integer) 4
127.0.0.1:6379> RPUSH list1 2
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1 #从 下标0 到最后一个
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
lpop 出队列
127.0.0.1:6379> lpop list1"c"127.0.0.1:6379> lpop list1"b"
LLEN 计算队列长度
127.0.0.1:6379> LLEN list1
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
1) "a"
2) "1"
3) "2"
4、set命令
无序 ,不可重复 作用:去重 取交集 并集
127.0.0.1:6379> sadd set1 a b c #向set中添加 数据
(integer) 3
127.0.0.1:6379> sadd set1 c a # 如果set 中有这 不能添加
(integer) 0
127.0.0.1:6379> sadd set1 d
(integer) 1
127.0.0.1:6379> SMEMBERS set1 # 获取集合中所有成员
1) "c"
2) "b"
3) "a"
4) "d"
spop 随机获取数据
127.0.0.1:6379> spop set1 2
1) "b"
2) "d"
127.0.0.1:6379> SMEMBERS set1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
127.0.0.1:6379> sadd set2 1 2 3 d a
(integer) 5
127.0.0.1:6379> SMEMBERS set2
1) "3"
2) "2"
3) "d"
4) "1"
5) "a"
127.0.0.1:6379> SINTER set1 set2 # 求交集
1) "a"
2) "d"
5、zset命令
zset 主要用于排名
添加 zset
127.0.0.1:6379> ZADD zset1 99 xiaoming 80 xiaowang 76 bobo
(integer) 3
127.0.0.1:6379> zadd zset1 60 xiaohong
(integer) 1
根据评分获取排名
127.0.0.1:6379> ZRANGE zset1 0 2
1) "xiaohong"
2) "bobo"
3) "xiaowang"
127.0.0.1:6379> ZRANGE zset1 0 2 withscores
1) "xiaohong"
2) "60"
3) "bobo"
4) "76"
5) "xiaowang"
6) "80"
127.0.0.1:6379> ZRANGE zset1 0 -1 withscores # 从小到达排序
1) "xiaohong"
2) "60"
3) "bobo"
4) "76"
5) "xiaowang"
6) "80"
7) "xiaoming"
8) "99"
127.0.0.1:6379> ZREVRANGE zset1 0 -1 withscores # 从 大到小 排序
1) "xiaoming"
2) "99"
3) "xiaowang"
4) "80"
5) "bobo"
6) "76"
7) "xiaohong"
8) "60"
6、其他常用命令
获取所有的key
127.0.0.1:6379> keys *
按照规则获取key
127.0.0.1:6379> keys set*
1) "set1"
2) "set2"
判断key 是否存在
127.0.0.1:6379> EXISTS a
(integer) 1
127.0.0.1:6379> EXISTS a1
删除key
127.0.0.1:6379> EXISTS a
(integer) 1
127.0.0.1:6379> EXISTS a1
设置key 存活时间
所有的key 都要设置一个 存活时间,否则key 永久有效,就有可能一直占用redis 内存
所有的key 都尽量有前缀 或者后缀
127.0.0.1:6379> EXPIRE b 10
(integer) 1
127.0.0.1:6379> get b
"acde"
127.0.0.1:6379> get b
"acde"
127.0.0.1:6379> get b
127.0.0.1:6379> SETEX user_1 10 xiaoming
OK
127.0.0.1:6379> SETEX user_2 10 zhangsan
OK
127.0.0.1:6379> keys user*
1) "user_2"
ttl 获取key 还可以活多久
127.0.0.1:6379> setex user_3 20 lisi
OK
127.0.0.1:6379> ttl user_3
(integer) 18
127.0.0.1:6379> ttl user_3
(integer) 16
127.0.0.1:6379> ttl user_3
(integer) 15
redis 单机版默认有16 库, 默认只是用 db0
切换数据库
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set a 1
OK
127.0.0.1:6379[1]> get a
"1"
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379>
获取当前 db key 数量
127.0.0.1:6379> dbsize
(integer) 8
127.0.0.1:6379> keys *
1) "e"
2) "set1"
3) "list1"
4) "set2"
5) "c"
6) "luping"
7) "d"
8) "student1"
清空当前 db
127.0.0.1:6379> FLUSHDB
清空所有 db
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> 127.0.0.1:6379> dbsize
以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章