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应用场景:
- 缓存
- 任务队列
- 网站访问统计
- 数据过期处理
- 分布式集群架构中的session分离
...
Jedis入门
Jedis介绍
- Jedis是Redis在Java客户端的开发包
- https://github.com/xetorthio/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
学而不思则罔,思而不学则殆!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具