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的主要内容,如果未能解决你的问题,请参考以下文章

中行网银错误码:5101 错误信息:没有证书,请插入USB Key确认您输入了正确的keyID?

确定 netezza 中行的加载日期

中行手机银行登录问题

java调用栈中行号

java调用栈中行号

java调用栈中行号