Redis入门

NoSQL概述

为什么需要NoSQL

  • High performance - 高并发读写(尤其是写操作)
  • Huge Storage - 海量数据的高效率存储和访问

NoSQ数据库分为四大类

  • 键值(Key:Value)存储 eg: Redis
  • 列存储 eg: HBase
  • 文档数据库 eg: MongoDB
  • 图形数据库 eg: Neo4j

NoSQL特点

  • 易扩展
  • 大数据量、高性能
  • 灵活的数据模型
  • 高可用

Redis概述

Redis是用C语言开发的具有高性能、并发性强的NoSQL数据库

支持以下数据类型: 字符串型、Hash对象类型、列表类型、集合类型、有序集合类型

Redis应用场景:

  1. 缓存
  2. 任务队列
  3. 网站访问统计
  4. 数据过期处理
  5. 分布式集群架构中的session分离
    ...

Jedis入门

Jedis介绍

// 1. 设置Redis缓存服务器所在主机的IP地址和端口
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2. 保存数据
jedis.set("username-test", "test-value");
// 3. 获取数据
String value = jedis.get("username-test");
System.out.println(value); // test-value
// 4. 释放资源
jedis.close();

数据类型

  • Key定义的注意点
* 不要过长
* 不要过短
* 统一的命名规范
  • 存储字符串
* 二进制安全的,存入和获取的数据相同
* Value最多可以容纳的数据长度是512M
  • 存储String常量命令
127.0.0.1:6379> set sch_name nuist
OK
127.0.0.1:6379> get sch_name
"nuist"
127.0.0.1:6379> getset sch_name niit
"nuist"
127.0.0.1:6379> get sch_name
"niit"
127.0.0.1:6379> del sch_name
(integer) 1
127.0.0.1:6379> get sch_name
(nil)
--------------------------------------
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> incr age
(integer) 23
127.0.0.1:6379> get age
"23"
127.0.0.1:6379> decr age
(integer) 22
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> incrby age 3
(integer) 25
127.0.0.1:6379> get age
"25"
127.0.0.1:6379> decrby age 3
(integer) 22
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> append age userage -- 拼接字符串
(integer) 9
127.0.0.1:6379> get age
"22userage"
  • 存储Hash常量命令
127.0.0.1:6379> hset studentInfo username Wangzz age 22 major SE
(integer) 3
127.0.0.1:6379> hget studentInfo username
"Wangzz"
127.0.0.1:6379> hget studentInfo major
"SE"
127.0.0.1:6379> hmget studentInfo username age
1) "Wangzz"
2) "22"
127.0.0.1:6379> hgetall studentInfo
1) "username"
2) "Wangzz"
3) "age"
4) "22"
5) "major"
6) "SE"
127.0.0.1:6379> hdel studentInfo major
(integer) 1
127.0.0.1:6379> hgetall studentInfo
1) "username"
2) "Wangzz"
3) "age"
4) "22"
127.0.0.1:6379> del studentInfo
(integer) 1
127.0.0.1:6379> hgetall studentInfo
(empty list or set)
127.0.0.1:6379> hset productInfo price 100
(integer) 1
127.0.0.1:6379> hincrby productInfo price 1
(integer) 101
127.0.0.1:6379> hget productInfo price
"101"
127.0.0.1:6379> hexists productInfo price
(integer) 1
127.0.0.1:6379> hexists productInfo total
(integer) 0
127.0.0.1:6379> hkeys productInfo
1) "price"
127.0.0.1:6379> hvals productInfo
1) "101"
  • 存储List

    • ArrayList使用数组方式
    • LinkedList使用双向链表方式
    • 双向链表中增加数据
    • 双向链表中删除数据
127.0.0.1:6379> lpush myList "a" "b" "c"
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush myList 1 2 3
(integer) 6
127.0.0.1:6379> lrange myList 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
127.0.0.1:6379> lpop myList
"c"
127.0.0.1:6379> rpop myList
"3"
127.0.0.1:6379> llen myList
(integer) 4
127.0.0.1:6379> lpushx myList x
(integer) 5
127.0.0.1:6379> lrange myList 0 -1
1) "x"
2) "b"
3) "a"
4) "1"
5) "2"
127.0.0.1:6379> rpush myList y
(integer) 6
127.0.0.1:6379> lrange myList 0 -1
1) "x"
2) "b"
3) "a"
4) "1"
5) "2"
6) "y"
127.0.0.1:6379> lpush myList 3
(integer) 7
127.0.0.1:6379> rpush myList 3
(integer) 8
127.0.0.1:6379> lrange myList 0 -1
1) "3"
2) "x"
3) "b"
4) "a"
5) "1"
6) "2"
7) "y"
8) "3"
127.0.0.1:6379> lrem myList 2 3 -- 从左向右删除List中两个3
(integer) 2
127.0.0.1:6379> lrange myList 0 -1
1) "x"
2) "b"
3) "a"
4) "1"
5) "2"
6) "y"
127.0.0.1:6379> lpush myList 33
(integer) 9
127.0.0.1:6379> lpush myList 33
(integer) 10
127.0.0.1:6379> lrange myList 0 -1
1) "33"
2) "33"
3) "x"
4) "b"
5) "a"
6) "1"
7) "2"
8) "y"
9) "33"
10) "3"
127.0.0.1:6379> lrem myList 0 33 -- 删除所有的33
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "x"
2) "b"
3) "a"
4) "1"
5) "2"
6) "y"
7) "3"

  • 存储set
    • Set集合支持无序、不重复
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> hmget myset
(error) ERR wrong number of arguments for 'hmget' command
127.0.0.1:6379> mget myset
1) (nil)
127.0.0.1:6379> srem myset
(error) ERR wrong number of arguments for 'srem' command
127.0.0.1:6379> sadd myset a
(integer) 0
127.0.0.1:6379> sadd myset 1 2 3
(integer) 0
127.0.0.1:6379> smembers myset
1) "2"
2) "c"
3) "1"
4) "3"
5) "a"
6) "b"
127.0.0.1:6379> sismembers myset d
(error) ERR unknown command `sismembers`, with args beginning with: `myset`, `d`,
127.0.0.1:6379> sismember myset d
(integer) 0
127.0.0.1:6379> scard myset
(integer) 6
127.0.0.1:6379> srandmember myset
"b"
127.0.0.1:6379> srandmember myset
"2"
127.0.0.1:6379> smembers myset
1) "2"
2) "c"
3) "1"
4) "3"
5) "a"
6) "b"
  • 存储Sorted-set
    • Sorted-Set 和 Set区别
    • Sorted-Set中的成员在集合中的位置是有序的

适用于排名功能

127.0.0.1:6379> zadd mysort 70 zs 80 ls 90 ww
(integer) 3
127.0.0.1:6379> zadd mysort 100 zs
(integer) 0
127.0.0.1:6379> zadd mysort 60 tom
(integer) 1
127.0.0.1:6379> zscore tom
(error) ERR wrong number of arguments for 'zscore' command
127.0.0.1:6379> zscore mysort tom
"60"
127.0.0.1:6379> zcard mysort
(integer) 4
127.0.0.1:6379> zrem mysort tom
(integer) 1
127.0.0.1:6379> zcard mysort
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "ls"
2) "ww"
3) "zs"
127.0.0.1:6379> zrange mysort 0 0
1) "ls"
127.0.0.1:6379> zrevrange mysort 0 -1 withscores
1) "zs"
2) "100"
3) "ww"
4) "90"
5) "ls"
6) "80"
127.0.0.1:6379> zrangebyscore mysort 0 100
1) "ls"
2) "ww"
3) "zs"
127.0.0.1:6379> zrangebyscore mysort 0 100 WITHSCORES 0 2
(error) ERR syntax error
127.0.0.1:6379> zrangebyscore mysort WITHSCORES 0 2
(error) ERR min or max is not a float
127.0.0.1:6379> zrangebyscore mysort 0 100 withscores limit 0 2
1) "ls"
2) "80"
3) "ww"
4) "90"
127.0.0.1:6379> zscore mysort ls
"80"
127.0.0.1:6379> zcount mysort 80 90
(integer) 2

Sorted-Set使用场景 eg: 大型游戏玩家实时积分排名

keys常用操作

127.0.0.1:6379> keys u*
1) "user:100"
2) "user"
3) "user:1000"
4) "username-test"
5) "username"
127.0.0.1:6379> set k01 test
OK
127.0.0.1:6379> set k02 test
OK
127.0.0.1:6379> set k03 test
OK
127.0.0.1:6379> keys k0*
1) "k01"
2) "k03"
3) "k02"
127.0.0.1:6379> del k01 k02 k03
(integer) 3
127.0.0.1:6379> exists k01
(integer) 0
127.0.0.1:6379> get user
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get user
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get "username"
"wangzz"
127.0.0.1:6379> get "user"
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> rename username new-username
OK
127.0.0.1:6379> keys user*
1) "user:100"
2) "user"
3) "user:1000"
4) "username-test"
127.0.0.1:6379> get "new-username"
"wangzz"
127.0.0.1:6379> expire newcompany 1000
(integer) 0
127.0.0.1:6379> ttl newcompany
(integer) -2
127.0.0.1:6379> expire newcompany
(error) ERR wrong number of arguments for 'expire' command
127.0.0.1:6379> expire new-username 1000
(integer) 1
127.0.0.1:6379> ttl new-username
(integer) 997
127.0.0.1:6379> ttl new-username
(integer) 991
127.0.0.1:6379> ttl new-username
(integer) 980
127.0.0.1:6379> expire new-username 10
(integer) 1
127.0.0.1:6379> ttl new-username
(integer) 5
127.0.0.1:6379> ttl new-username
(integer) -2
127.0.0.1:6379> get "new-username"
(nil)

Redis特性

多数据库

127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
(empty list or set)
127.0.0.1:6379[3]> select 1
OK
127.0.0.1:6379[1]> keys *
1) "wangzz"
2) "openmind"
3) "\xe5\x94\x90\xe7\xba\xb3\xe5\xbe\xb7\xc2\xb7\xe7\x89\xb9\xe6\x9c\x97\xe6\x99\xae"
4) "test"
5) "Donald"
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> keys *
1) "mysort"
2) "emp:100"
3) "hackers"
4) "price_demo"
5) "user:100"
6) "info"
7) "myset"
8) "leadername"
9) "test_NUM"
10) "price"
11) "myhash"
12) "user"
13) "middle_size"
14) "test-info"
15) "productInfo"
16) "testKey"
17) "student001"
18) "gfname"
19) "student"
20) "user:1000"
21) "mykey"
22) "sal"
23) "intro"
24) "number01"
25) "username-test"
26) "small_size"
27) "mylist"
28) "leaderName"
29) "age"
30) "emp-name"
31) "info-list"
32) "java framework"
33) "number"
34) "emp-age"
35) "large_size"
36) "PI"
37) "company_name"
38) "list-info"
39) "iPad-mini5 Info"
40) "nil_key"
41) "test_num"
42) "job"
43) "student002"
44) "test-info-test"
45) "myList"

Redis事务【multi、exec、discard】

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set trx test-v
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get "trx"
(nil)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set trx test-v
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get "trx"
"test-v"

Redis持久化

两种持久化方式: RDB方式、AOF方式

持久化使用方式: 1.RDB持久化 2.AOF持久化 3.无持久化 4.同时使用RDB和AOF

RDB(Redis DataBase)方式

指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

AOF(Append Only File)方式

redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

AOF和RDB详解: https://baijiahao.baidu.com/s?id=1654694618189745916&wfr=spider&for=pc

posted @   Felix_Openmind  阅读(85)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}
点击右上角即可分享
微信分享提示