redis:NoSQL数据库的背景,简介,redis安装,目录,启动,使用,数据类型,配置文件,java的redis客户端Jedis,手机验证码练习

NoSQL数据库

背景

Web1.0的时代,数据访问量很有限,
用一夫当关的高性能的单点服务器可以解决大部分问题。

在这里插入图片描述

随着Web2.0的时代的到来,用户访问量大幅度提升,
同时产生了大量的用户数据。加上后来的智能移动设备的普及,
所有的互联网平台都面临了巨大的性能挑战。

在这里插入图片描述

解决应服务器的cpu和内存压力
session存在哪?

方案1: 存在cookie里
	1、不安全
	2、网络负担效率低
方案2: 存在文件服务器或者数据库里
	 1、大量的IO效率问题
方案3:session复制  
	 session数据冗余
	节点越多浪费越大
方案4:  缓存数据库
	完全在内存中,速度快
	数据结构简单

在这里插入图片描述
在这里插入图片描述

简介

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。 
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。
	因此大大的增加了数据库的扩展能力。
不遵循SQL标准。
不支持ACID。
远超于SQL的性能。
NoSQL适用场景
	对数据高并发的读写
	海量数据的读写
	对数据高可扩展性的
 NoSQL不适用场景
	需要事务支持
	基于sql的结构化查询存储,处理复杂的关系,需要即席查询。
数据库还分为列式数据库和行式数据库
列式数据库是查询一列的数据速度快,比如是查询平均年龄这样快
行式数据库是查询一行快,比如查询一个学生的所有消息快,要是用它来
查询学生的平均年龄那就慢很多
相关技术
Memcached
	很早出现的NoSql数据库
	数据都在内存中,一般不持久化
	支持简单的key-value模式
	一般是作为缓存数据库辅助持久化的数据库
rdis
	几乎覆盖了Memcached的绝大部分功能
	数据都在内存中,支持持久化,主要用作备份恢复
	除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
	一般是作为缓存数据库辅助持久化的数据库
mongoDB
	高性能、开源、模式自由(schema  free)的文档型数据库
	数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
	虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
	支持二进制数据及大型对象
	可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。
HBase
	HBase是Hadoop项目中的数据库。
	它用于需要对大量的数据进行随机、实时的读写操作的场景中。
	HBase的目标就是处理数据量非常庞大的表,
	可以用普通的计算机处理超过10亿行数据,
	还可处理有数百万列元素的数据表。
Cassandra
	Apache Cassandra是一款免费的开源NoSQL数据库,
	其设计目的在于管理由大量商用服务器构建起来的
	庞大集群上的海量数据集(数据量通常达到PB级别)。
	在众多显著特性当中,Cassandra最为卓越的长处是对写入及
	读取操作进行规模调整,而且其不强调主集群的设计思
	路能够以相对直观的方式简化各集群的创建与扩展流程。

redis

安装

官网

有windows版本的,也有Linux版本的
Linux:
	1.下载获得redis-3.2.5.tar.gz后将它放入我们的Linux目录/opt
	2、解压命令:tar -zxvf redis-3.2.5.tar.gz
	3、解压完成后进入目录:cd redis-3.2.5
	4.在redis-3.2.5目录下执行make命令
		如果gcc:命令未找到
			      yum install gcc
			      yum install gcc-c++
	5.在redis-3.2.5目录下再次执行make命令
		Jemalloc/jemalloc.h:没有那个文件
		解决方案:运行make distclean之后再 make
	6、在redis-3.2.5目录下再次执行make命令
	7.执行完make后,跳过Redis test 继续执行make install

目录

查看默认安装目录:usr/local/bin
	Redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何(服务启动起来后执行)
	Redis-check-aof:修复有问题的AOF文件
	Redis-check-dump:修复有问题的dump.rdb文件
	Redis-sentinel:Redis集群使用
	redis-server:Redis服务器启动命令
	redis-cli:客户端,操作入口

启动

备份redis.conf:拷贝一份redis.conf到其他目录

修改redis.conf文件将里面的daemonize no 改成 yes,让服务在后台启动

启动命令:执行  redis-server   /root/myredis/redis.conf
(后面是启动的配置文件地址)
用客户端访问: redis-cli
测试验证: ping  返回pong就行了
带有一些参数启动
redis-cli -h 127.0.0.1 -p 6379
-h是网络地址
-p是端口号
关闭:
	1.在客户端:shutdown
	2.没有客户端:redis-cli shutdown

相关知识

默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令 select   <dbid>  来切换数据库。如: select 8 

统一密码管理,所有库都是同样密码,要么都OK要么一个也连接不上。
redis是单线程+多路IO复用技术
	串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)

	多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,
	比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,
	则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,
	也可以启动线程执行(比如使用线程池)。

比喻说明:
	阻塞IO,给女神发一条短信,说我来找你了,然后就默默的一直等着女神下楼,
		这个期间除了等待你不会做其他事情,属于备胎做法.
	
	非阻塞IO,给女神发短信,如果不回,接着再发,一直发到女神下楼,
		这个期间你除了发短信等待不会做其他事情,属于专一做法.
		
	I0多路复用,是找一个宿管大妈来帮你监视下楼的女生,这个期间你可以些其他的事情.
		例如可以顺便看看其他妹子,玩玩王者荣耀,上个厕所等等,
		I0复用又包括 select,poll,epoll模式,那么它们的区别是什么?
		
	3.1 select大妈每一个女生下楼,select大妈都不知道这个是不是你的女神,
		她需要一个一个询问,并且select大妈能力还有限,最多一次帮你监视1024个妹子
		
	3.2 poll大妈不限制盯着女生的数量,只要是经过宿舍楼门囗的女生,都会帮你去问是不是你女神

	3.3epoll大妈不限制订着女生的数量,并且也不需要一个一个去问,那么如何做呢?
		epoll大妈会为每个进宿舍楼的女生脸上贴上一个大字条,上面写上女生自己的名字,
		只要女生下楼了,epoll大妈就知道这个是不是你女神了,然后大妈再通知你。

数据类型

在这里插入图片描述

key
我们可以将这里的key理解成java中的变量名,
而值理解成java里面的变量名里面存储的值
keys  *
	查询当前库的所有键

exists  <key>
	判断某个键是否存在

type  <key>   
	查看键的类型

del  <key>
	删除某个键

expire   <key>   <seconds>
	为键值设置过期时间,单位秒。

ttl   <key> 
	查看还有多少秒过期,-1表示永不过期,-2表示已过期

dbsize  
	查看当前数据库的key的数量

flushdb
	清空当前库

flushall
	通杀全部库 
string
String是Redis最基本的类型,一个key对应一个value。

String类型是二进制安全的。意味着Redis的string可以包含任何数据。
	比如jpg图片或者序列化的对象 。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
get   <key>
	查询对应键值

set   <key>  <value>
	添加键值对

append  <key>  <value>
	将给定的<value> 追加到原值的末尾

strlen  <key>
	获得值的长度

setnx  <key>  <value>
	只有在 key 不存在时设置 key 的值

incr  <key>
	将 key 中储存的数字值增1
	只能对数字值操作,如果为空,新增值为1

decr  <key>
	将 key 中储存的数字值减1
	只能对数字值操作,如果为空,新增值为-1

incrby / decrby  <key>  <步长>
	将 key 中储存的数字值增减。自定义步长。
原子性
	所谓原子操作是指不会被线程调度机制打断的操作;
	这种操作一旦开始,就一直运行到结束,
	中间不会有任何 context switch (切换到另一个线程)。

(1) 在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",
	因为中断只能发生于指令之间。
(2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
Redis单命令的原子性主要得益于Redis的单线程
java中的i++是否是原子操作?
mset  <key1>  <value1>  <key2>  <value2>  ..... 
	同时设置一个或多个 key-value对  

mget  <key1>   <key2>   <key3> ..... 
	同时获取一个或多个 value  

msetnx <key1>  <value1>  <key2>  <value2>  ..... 
	同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

getrange  <key>  <起始位置>  <结束位置>
	获得值的范围,类似java中的substring

setrange  <key>   <起始位置>   <value><value>  覆写<key> 所储存的字符串值,从<起始位置>开始。

setex  <key>  <过期时间>   <value>
	设置键值的同时,设置过期时间,单位秒。
	
getset <key>  <value>
	以新换旧,设置了新值同时获得旧值。
List
	单键多值
	Redis 列表是简单的字符串列表,按照插入顺序排序。
		你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
	它的底层实际是个双向链表,对两端的操作性能很高,
		通过索引下标的操作中间的节点性能会较差。
lpush/rpush  <key>  <value1>  <value2>  <value3> ....
	从左边/右边插入一个或多个值。

lpop/rpop  <key> 
	从左边/右边吐出一个值。
	值在键在,值亡键亡。

 rpoplpush  <key1>  <key2><key1>列表右边吐出一个值,插到<key2>列表左边。

lrange <key> <start> <stop>
	按照索引下标获得元素(从左到右)

lindex <key> <index>
	按照索引下标获得元素(从左到右)

获得列表长度 
	llen <key>

 linsert <key>  before <value>  <newvalue><value>的前面插入<newvalue> 

 lrem <key> <n>  <value>
	从左边删除n个value(从左到右),
	如果n是正数,就从左边开始删除
	如果n是负数,就从右边开始删除
	如果是0,就删除全部
set
Redis set对外提供的功能与list类似是一个列表的功能,
特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,
又不希望出现重复数据时,set是一个很好的选择,
并且set提供了判断某个成员是否在一个set集合内的重要接口,
这个也是list所不能提供的。
Redis的Set是string类型的无序集合。
它底层其实是一个value为null的hash表,
就是底层是一个HashMap,里面的key是存放set的值的,value是null
所以添加,删除,查找的复杂度都是O(1)
sadd <key>  <value1>  <value2> .....   
	将一个或多个 member 元素加入到集合 key 当中,
	已经存在于集合的 member 元素将被忽略。

smembers <key>
	 取出该集合的所有值。

sismember <key>  <value>
	 判断集合<key>是否为含有该<value>值,有返回1,没有返回0

scard   <key>
	 返回该集合的元素个数。

srem <key> <value1> <value2> ....
	 删除集合中的某个元素。

spop <key>  
	 随机从该集合中吐出一个值。

srandmember <key> <n>
	随机从该集合中取出n个值。
	不会从集合中删除


sinter <key1> <key2>  
	 返回两个集合的交集元素。

sunion <key1> <key2>  
	 返回两个集合的并集元素。

sdiff <key1> <key2>  
	 返回两个集合的差集元素。
hash
Redis  hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,
	hash特别适合用于存储对象。
	类似Java里面的Map<String,Object>
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,
如果用普通的key/value结构来存储,主要有以下2种存储方式:

在这里插入图片描述

hset <key>  <field>  <value><key>集合中的  <field>键赋值<value>

hget <key1>  <field><key1>集合<field> 取出 value 

hmset <key1>  <field1> <value1> <field2> <value2>...   
	 批量设置hash的值

hexists key  <field>
	查看哈希表 key 中,给定域 field 是否存在。 

hkeys <key>   
	 列出该hash集合的所有field

hvals <key>    
	 列出该hash集合的所有value

hincrby <key> <field>  <increment> 
	为哈希表 key 中的域 field 的值加上增量 increment 
	
hgetall <key>
	获取该hash集合的所有key和value

hsetnx <key>  <field> <value>
	将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
zset (sorted set)
Redis有序集合zset与普通集合set非常相似,
    是一个没有重复元素的字符串集合。
    不同之处是有序集合的所有成员都关联了一个评分(score) ,
    这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。
    集合的成员是唯一的,但是评分可以是重复了 。
    
因为元素是有序的, 所以你也可以很快的根据评分(score)
    或者次序(position)来获取一个范围的元素。
    访问有序集合的中间元素也是非常快的,
    因此你能够使用有序集合作为一个没有重复成员的智能列表。
zadd  <key> <score1> <value1>  <score2> <value2>...
	将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
	将同一个元素,不同的分数添加到zset中,会将分数更新
	将不同的元素,同一个分数添加到zset中,可以正常添加进去

zrange <key>  <start> <stop>  [WITHSCORES]   
	返回有序集 key 中,下标在<start> <stop>之间的元素
	带WITHSCORES,可以让分数一起和值返回到结果集。

zrangebyscore key min max [withscores] [limit offset count]
	返回有序集 key 中,所有 score 值介于 min 和 max 之间
	(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 

zrevrangebyscore key max min [withscores] [limit offset count]
	 同上,改为从大到小排列。 

zincrby <key> <increment> <value>
	为元素的score加上增量

zrem  <key>  <value>  
	删除该集合下,指定值的元素 

zcount <key>  <min>  <max> 
	统计该集合,分数区间内的元素个数 

zrank <key>  <value> 
	返回该值在集合中的排名,从0开始。

配置文件

ip地址绑定(bind)
	默认情况bind=127.0.0.1只能接受本机的访问请求
	不写的情况下,无限制接受任何ip地址的访问
	生产环境肯定要写你应用服务器的地址
	如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,
	Redis只允许接受本机的相应

tcp-backlog
	可以理解成一个请求到达后至接受进程处理前的队列中的最大个数

timeout
	一个空闲的客户端维持多少秒会关闭,0是永不关闭

TCP keepalive
	对访问客户端的一种心跳检测,每隔n秒检测一次,官方推荐60秒

daemonize
	是否是后台进程

log level
	四个级别根据使用阶段来选择,生产环境选择notice或者warning

logfile
	日志文件名称

database
	设定库的数量,默认16

requirepass
	设置永久性密码

命令行中设置临时密码
	config set requirepass "密码"
登录
	auth 密码

maxclient 
	最大客户端连接数

maxmemory
	设置Redis可以使用的内存量。一旦到达内存使用上限,
	Redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
	如果Redis无法根据移除规则来移除内存中的数据,
	或者设置了“不允许移除”,那么Redis则会针对那些需要申
	请内存的指令返回错误信息,比如SET、LPUSH等。

Maxmemory-policy
	(1volatile-lru:使用LRU(最近最少使用)算法移除key,只对设置了过期时间的键
	(2)allkeys-Iru:使用LRU算法移除key
	(3volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
	(4)allkeys-random:移除随机的key
	(5volatile-ttl(即将过期):移除那些TTL值最小的key,即那些最近要过期的key
	(6)noeviction:不进行移除。针对写操作,只是返回错误信息

Maxmemory-samples
	设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,
	而是估算值,所以你可以设置样本的大小。
	一般设置37的数字,数值越小样本越不准确,但是性能消耗也越小。

Java的Redis客户端Jedis

需要的jar包
	Jedis-2.1.0.jar

Jedis测试连通性
package com.jane.redis;
import redis.clients.jedis.Jedis;
public class Test
{
	public static void main(String[] args)
	{
		Jedis jedis=new Jedis("10.235.140.206", 6379);
		String ping = jedis.ping();
		System.out.println(ping);
	}
}
手机验证码功能练习
要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能发送3次验证码
页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="static/jquery/jquery-3.1.0.js"></script>
<link href="static/bootstrap.min.css" rel="stylesheet" />
<script src="static/bootstrap.min.js"></script>

</head>
<body>
	<div class="container">
		<div class="row">
			<div id="alertdiv" class="col-md-12">
				<form class="navbar-form navbar-left" role="search" id="codeform">
					<div class="form-group">
						<input type="text" class="form-control" placeholder="填写手机号"
							name="phone_no">
						<button type="button" class="btn btn-default" id="sendCode">发送验证码</button>
						<br> <font id="countdown" color="red"></font> <br> <input
							type="text" class="form-control" placeholder="填写验证码"
							name="verify_code">
						<button type="button" class="btn btn-default" id="verifyCode">确定</button>
						<font id="result" color="green"></font><font id="error"
							color="red"></font>
					</div>
				</form>
			</div>
		</div>
	</div>

</body>
<script type="text/javascript">
	var t = 120;//设定倒计时的时间 
	var interval;
	function refer() {
		$("#countdown").text("请于" + t + "秒内填写验证码 "); // 显示倒计时 
		t--; // 计数器递减 
		if (t <= 0) {
			clearInterval(interval);
			$("#countdown").text("验证码已失效,请重新发送! ");
		}
	}

	$(function(){
		$("#sendCode").click(
				function() {


					$.post("/redis/CodeSenderServlet", $("#codeform").serialize(),
							function(data) {
								if (data == "true") {
									t = 120;
									clearInterval(interval);
									/* setInterval是个定时器,每一秒钟执行refer()这个方法 */
									interval = setInterval("refer()", 1000);//启动1秒定时  
								} else if (data == "limit") {
									clearInterval(interval);
									$("#countdown").text("单日发送超过次数! ")
								}
							});
				});

		$("#verifyCode").click(
				function() {

					$.post("/redis/CodeVerifyServlet",
							$("#codeform").serialize(), function(data) {
								if (data == "true") {
									$("#result").attr("color", "green");
									$("#result").text("验证成功");
									clearInterval(interval);
									$("#countdown").text("")
								} else {
									$("#result").attr("color", "red");
									$("#result").text("验证失败");
								}
							});
				});

	});
</script>
</html>
servlet
package com.jane.servlet;

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import redis.clients.jedis.Jedis;

public class CodeSenderServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	public CodeSenderServlet()
	{
		super();
	}
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		//获取手机号
		String phone_no = request.getParameter("phone_no");
		//获取验证码
		String code =getCode(6);
		//拼接key
		String codekey ="Verify_code:"+phone_no+":code";
		String countkey ="Verify_code:"+phone_no+":count";
		Jedis jedis=new Jedis("10.235.140.206", 6379);
		//判断发送验证码的次数
		String count = jedis.get(countkey);
		if(count==null)
		{
			//第一次
			jedis.setex(countkey, 24*60*60, "1");
		}
		else if(Integer.parseInt(count)<=2)
		{
			jedis.incr(countkey);
		}
		else if (Integer.parseInt(count)>2) 
		{
			response.getWriter().print("limit");
			jedis.close();
			return;
		}
		
		//向redis中存储,以手机号为键,验证码为值
		jedis.setex(codekey, 120, code);
		response.getWriter().print(true);
		jedis.close();
	}
	private String getCode(int length)
	{
		String code="";
		Random random=new Random();
		for(int i=0;i<length;i++)
		{
			int rand=random.nextInt(10);
			code+=rand;
		}
		return code;
	}
}
package com.jane.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import redis.clients.jedis.Jedis;

public class CodeVerifyServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	public CodeVerifyServlet()
	{
		super();
	}

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		//获取验证码和手机号
		String phone_no = request.getParameter("phone_no");
		String verify_code = request.getParameter("verify_code");
		//拼接key
		String codekey ="Verify_code:"+phone_no+":code";
		//从redis获取手机号中对应的验证码
		Jedis jedis =new Jedis("10.235.140.206", 6379);
		String code = jedis.get(codekey);
		if(code.equals(verify_code))
		{
			response.getWriter().print(true);
		}
		jedis.close();
	}

}

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>redis</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>CodeSenderServlet</display-name>
    <servlet-name>CodeSenderServlet</servlet-name>
    <servlet-class>com.jane.servlet.CodeSenderServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CodeSenderServlet</servlet-name>
    <url-pattern>/CodeSenderServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>CodeVerifyServlet</display-name>
    <servlet-name>CodeVerifyServlet</servlet-name>
    <servlet-class>com.jane.servlet.CodeVerifyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CodeVerifyServlet</servlet-name>
    <url-pattern>/CodeVerifyServlet</url-pattern>
  </servlet-mapping>
</web-app>
atguigu中学习redis的笔记
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2.1 Redis安装与配置: 1. 下载Redis安装包:官网下载地址为 https://redis.io/download 。 2. 解压Redis安装包:使用命令 tar -zxvf redis-x.x.x.tar.gz 进行解压。 3. 进入解压后的Redis目录使用命令 make 编译Redis。 4. 编译完成后,使用命令 make test 进行测试。 5. 安装Redis使用命令 make install 进行安装。 6. 配置Redis:进入Redis目录中的 /redis.conf 文件,修改配置文件中的端口号、密码等参数。 7. 启动Redis使用命令 redis-server 启动Redis服务。 2.2 Redis数据操作: Redis是一种内存数据库,它支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。 下面是Java使用Redis的操作示例: 1. 引入Redis依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 2. 连接RedisJedis jedis = new Jedis("localhost"); 3. 存储数据: jedis.set("key", "value"); 4. 获取数据: String value = jedis.get("key"); 5. 删除数据: jedis.del("key"); 6. 存储哈希: Map<String, String> map = new HashMap<>(); map.put("field1", "value1"); map.put("field2", "value2"); jedis.hmset("key", map); 7. 获取哈希: Map<String, String> map = jedis.hgetAll("key"); 8. 存储列表: jedis.lpush("key", "value1", "value2"); 9. 获取列表: List<String> list = jedis.lrange("key", 0, -1); 10. 存储集合: jedis.sadd("key", "value1", "value2"); 11. 获取集合: Set<String> set = jedis.smembers("key"); 12. 存储有序集合: jedis.zadd("key", 1, "value1"); jedis.zadd("key", 2, "value2"); 13. 获取有序集合: Set<String> set = jedis.zrange("key", 0, -1);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReflectMirroring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值