1 nosql概念
nosql(not only sql) 不仅仅是sql的意思,可以具备关系数据库存储数据的作用,但是基于内存存储,存取速度会更快,在项目中为了提高项目响应速度,在某些场景下,更倾向于使用nosql数据。
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模(京东,淘宝,天猫等)和高并发的SNS(社交类服务网站QQ,微信,快手,抖音等等)类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题(关系型数据是进行磁盘IO,速度慢),而非关系型的数据库则由于其本身的特点(基于内存IO)得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据(数据量大)集合多重数据种类(文字信息,图片,视频,音频等等)带来的挑战,特别是大数据应用难题。
![在这里插入图片描述](https://img-blog.csdnimg.cn/1b50433e4ea04d73a292f01a262fde73.png)
2 常用nosql框架
HBase 大数据必讲 HBase 是一个开源的 非关系型分布式数据库(NoSQL),它参考了 谷歌 的 BigTable 建模,实现的编程语言为 Java。它是 Apache 软件基金会的 Hadoop 项目的一部分,运行于 HDFS 文件系统之上,为 Hadoop 提供类似于 BigTable 规模的服务。因此,它可以 容错地 存储 海量稀疏 的数据。 Redis Redis 是一个使用 ANSI C语言 编写的 开源、支持网络、基于内存、可选持久性 的 键值(key value)对存储 数据库。Redis 是目前最流行的 键值对存储 数据库之一。 Memcached Memcached 是一个 开放源代码、高性能、分配的 内存对象缓存系统。用于加速动态 web 应用程序,减轻关系型数据库负载。它可以应对 任意多个连接,使用 非阻塞的网络 IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个 Hash 表,Memcached 自管理这些 Hash 表。 Memcached 简单而强大。它简单的设计促进 迅速部署,易于发现所面临的问题,解决了很多 大型数据缓存。 MongoDB MongoDB 是一个基于 分布式文件存储 的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的 高性能 数据存储解决方案。 MongoDB 是一个介于 关系数据库 和 非关系数据库 之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的 NoSQL。
3 redis简介和特点
中文官网:http://www.redis.cn/ redis (remote dictionary server) 简介: Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库(持久化)、缓存和消息中间件(MQ message queue)。C语言编写。 特点:
- 速度快
基于内存读写,读写速度非常快,读一秒能达到11万次,写一秒能达到8.1万次。 2)支持持久化 可以长久保存数据(把内存数据通过一定策略写入到磁盘上),不像其他的nosql框架如Memcached不可以持久化 RDB(redis database):把内存中写入的数据按照配置策略,指定时间段内把数据保存磁盘文件上。 AOF(append of file): 把执行命令保存到磁盘上日志文件中,当数据需要恢复时,再次读取日志文件,重新生成数据。 后面会详细讲解 3)支持事务(原子性操作) 支持原子性操作,通过multi exec discard命令,支持事务。 事务的支持没有关系型数据库支持的好。 后面详细讲解。 4)支持多种语言 几乎支持现在流行的所有语言。
4 redis单机版搭建
克隆redis1,修改IP,修改主机名称,xshell连接
主机名称:redis1, IP:192.168.xxx.31
修改主机名称:
vim /etc/hostname
修改网卡:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
:15 修改IP地址 192.168.XXX.31
重新启动:
reboot
使用xshell进行连接
2 下载安装包,解压,安装配置,启动redis
1)使用xftp上传安装包到/root/software中
2) 创建目录,解压压缩包
mkdir /usr/redis
tar -xzvf /root/software/redis-5.0.5.tar.gz -C /usr/redis/
3) 安装配置
因为C语言编写,所以一定要先装C的编译器
ping www.baidu.com
yum -y install gcc-c++
使用的源码安装
cd /usr/redis/redis-5.0.5/
ls 发现没有configure 就需要自己指定安装目录
编译(从源文件中抽取指令过程)
make
安装
ls /usr/redis
make install PREFIX=/usr/redis
要使用PREFIX指定安装路径
ls /usr/redis 发现多了一个bin目录 说明安装成功
4) 启动redis
非后台运行方式启动:
ls /usr/redis/bin/ 发现redis-server服务器启动脚本 redis-cli 客户端启动脚本
/usr/redis/bin/redis-server 启动服务端,发现独占一个窗口
后台运行方式启动 :
复制配置文件到bin下
cp /usr/redis/redis-5.0.5/redis.conf /usr/redis/bin/
修改配置文件
vim /usr/redis/bin/redis.conf
:136 daemonize yes
使用配置文件启动服务(脚本+参数启动):
/usr/redis/bin/redis-server /usr/redis/bin/redis.conf
回车启动,发现不再占用窗口
检查是否启动成功:
ps -ef |grep redis |grep -v grep
可以看到一个redis-server进程在运行,标识后台启动成功
在本窗口就可以使用redis客户端连接
5 redis常用命令
和connect有关的
ping 服务器 不加参数测试服务器是否连通
127.0.0.1:6379> ping
PONG
echo 回显输入的字符串
127.0.0.1:6379> echo 111
"111"
127.0.0.1:6379> echo 'hello world'
"hello world"
quit 关闭客户端连接 退出 (有别于shutdown 不会关闭服务端)
127.0.0.1:6379> quit
ps -ef |grep redis |grep -v grep 还可以看到redis进程没有关闭服务器
select 选择新数据
vim /usr/redis/bin/redis.conf
:186 行 databases 16
设置当前数据库数量为16,默认的数据是db0, 可以使用select dbid dbid的范围是0-(databases-1) ,如果不改16,就是0-15
和server有关的
dbsize 返回当前数据里面keys的数量。
127.0.0.1:6379[15]> keys *
1) "cc"
2) "c"
127.0.0.1:6379[15]> dbsize
(integer) 2
flushdb 清空当前库
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
flushall 清空所有库
和keys有关的
keys 查找所有匹配给定模式的键 * 统配所有的
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 2
OK
127.0.0.1:6379> keys *
1) "b"
2) "a"
del 删除指定的key 一个或者多个
127.0.0.1:6379> keys *
1) "b"
2) "a"
127.0.0.1:6379> set c 3
OK
127.0.0.1:6379> keys *
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> keys *
1) "c"
2) "b"
127.0.0.1:6379> del b c
(integer) 2
127.0.0.1:6379> keys *
(empty list or set)
expire 设置key的过期时间
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> expire a 5
(integer) 1
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> keys *
(empty list or set)
move 移动一个key到另一个库中
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> move a 2
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
1) "a"
rename 修改key的名称
127.0.0.1:6379[2]> keys *
1) "a"
127.0.0.1:6379[2]> rename a aa
OK
127.0.0.1:6379[2]> keys *
1) "aa"
ttl 获取key有效时间(单位为秒)
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> expire a 50
(integer) 1
127.0.0.1:6379> ttl a
(integer) 34
127.0.0.1:6379> ttl a
(integer) 29
127.0.0.1:6379> ttl a
(integer) 26
127.0.0.1:6379> ttl a
(integer) 20
127.0.0.1:6379> ttl a
(integer) -2
127.0.0.1:6379> ttl a
(integer) -2
127.0.0.1:6379> ttl a
(integer) -2
127.0.0.1:6379> keys *
(empty list or set)
type 获取key存储类型
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> hset map1 k1 v1
(integer) 1
127.0.0.1:6379> hset map1 k2 v2
(integer) 1
127.0.0.1:6379> keys *
1) "map1"
2) "a"
127.0.0.1:6379> type map1
hash
exists 判断一个key是否存在
127.0.0.1:6379> keys *
1) "map1"
2) "a"
127.0.0.1:6379> exists a
(integer) 1
127.0.0.1:6379> exists map1
(integer) 1
127.0.0.1:6379> exists b
(integer) 0
127.0.0.1:6379> exists a map1
(integer) 2
127.0.0.1:6379> exists a map1 cc map2
(integer) 2
6 5种数据类型及作用场景
1)Strings 字符串类型
使用场景: 计数功能,验证码存储,分布式锁等等 常用命令: (set get mset mget incr decr setnx )
127.0.0.1:6379> set lock 3721 NX
OK
127.0.0.1:6379> keys *
1) "lock"
2) "a"
3) "abb"
4) "userinfo"
127.0.0.1:6379> set lock 3721 NX
(nil)
127.0.0.1:6379> set lock 3721 NX
(nil)
127.0.0.1:6379> set lock 3721 NX
(nil)
127.0.0.1:6379> set lock1 3722 NX
OK
127.0.0.1:6379> set lock1 3722 NX
(nil)
127.0.0.1:6379> set lock2 3722 XX
(nil)
127.0.0.1:6379> set lock1 3723 XX
OK
127.0.0.1:6379> get lock1
"3723"
127.0.0.1:6379> set lock3 EX 10 NX
(error) ERR syntax error
127.0.0.1:6379> set lock3 333 EX 10 NX
OK
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
OK
127.0.0.1:6379> set lock 3721 NX
OK
127.0.0.1:6379> keys *
1) "lock"
2) "a"
3) "abb"
4) "userinfo"
127.0.0.1:6379> set lock 3721 NX
(nil)
127.0.0.1:6379> set lock 3721 NX
(nil)
127.0.0.1:6379> set lock 3721 NX
(nil)
127.0.0.1:6379> set lock1 3722 NX
OK
127.0.0.1:6379> set lock1 3722 NX
(nil)
127.0.0.1:6379> set lock2 3722 XX
(nil)
127.0.0.1:6379> set lock1 3723 XX
OK
127.0.0.1:6379> get lock1
"3723"
127.0.0.1:6379> set lock3 EX 10 NX
(error) ERR syntax error
127.0.0.1:6379> set lock3 333 EX 10 NX
OK
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
(nil)
127.0.0.1:6379> set lock3 333 NX
OK
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> keys *
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> mget a b
1) "1"
2) "2"
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> incr a
(integer) 3
127.0.0.1:6379> incr a
(integer) 4
127.0.0.1:6379> incr a
(integer) 5
127.0.0.1:6379> get a
"5"
127.0.0.1:6379> decr a
(integer) 4
127.0.0.1:6379> decr a
(integer) 3
127.0.0.1:6379> decr a
(integer) 2
127.0.0.1:6379> decr a
(integer) 1
127.0.0.1:6379> decr a
(integer) 0
127.0.0.1:6379> decr a
(integer) -1
127.0.0.1:6379> decr a
(integer) -2
127.0.0.1:6379> get a
"-2"
127.0.0.1:6379> set b b
OK
127.0.0.1:6379> incr b
(error) ERR value is not an integer or out of range
在多线程同时执行一个业务时修改某一个变量时,保证同一时刻只有一个线程执行,叫做锁 当业务使用集群技术,让同一个业务放在不同的服务器上,每个服务器上都多个线程,保证所有服务器同一个时刻,只有一个线程执行业务,叫分布式锁
redis如何实现分布式锁(重要面试题setnx expire del )
1,使用setnx 在key不存在时设置值,实现加锁,其他线程无法在创建该key的锁 2,设置成功的,就等于拿到了锁,执行业务 3,执行业务之后,使用del删除锁 4,为了防止执行业务过程中出现异常,第3步没有执行,第1步执行完毕时, 使用expire 设置过期时间,防止出现死锁等现象,让多个请求等待)
// setnx 或者 set lock lock NX
redisTemplate.opsForValue().set("lock","lock",300,TimeUnit.MILLISECONDS);
//相当于上面一行
/*redisTemplate.opsForValue().setIfAbsent("lock","lock");
redisTemplate.expire("lock",300, TimeUnit.MILLISECONDS);*/
//执行一堆业务
deptDao.update(dept);
//执行。。。
//当上面业务出问题时,锁不会被删除 引发请求阻塞 可能引起死锁
redisTemplate.delete("lock");
2) hashs 散列类型(java-map集合)
使用场景: 用来存储各种资源信息。如:用户信息,部门信息,订单信息等等 常用命令: (hset hget hmset hmget hgetall hdel hkeys hvals hlen del删除key)
127.0.0.1:6379> hset userInfo userid 1001
(integer) 1
127.0.0.1:6379> hset userInfo userName 'zhangsan'
(integer) 1
127.0.0.1:6379> hset userInfo password 'tiger'
(integer) 1
127.0.0.1:6379> hmset userInfo age 18 email '321@qq.com'
OK
127.0.0.1:6379> hget userInfo age
"18"
127.0.0.1:6379> hget userInfo email
"321@qq.com"
127.0.0.1:6379> hmget userInfo userid userName pasword
1) "1001"
2) "zhangsan"
3) (nil)
127.0.0.1:6379> hgetall userInfo
1) "userid"
2) "1001"
3) "userName"
4) "zhangsan"
5) "password"
6) "tiger"
7) "age"
8) "18"
9) "email"
10) "321@qq.com"
127.0.0.1:6379> hdel userInfo userid
(integer) 1
127.0.0.1:6379> hgetall userInfo
1) "userName"
2) "zhangsan"
3) "password"
4) "tiger"
5) "age"
6) "18"
7) "email"
8) "321@qq.com"
127.0.0.1:6379> hkeys userInfo
1) "userName"
2) "password"
3) "age"
4) "email"
127.0.0.1:6379> hvals userInfo
1) "zhangsan"
2) "tiger"
3) "18"
4) "321@qq.com"
127.0.0.1:6379> hlen userInfo
(integer) 4
127.0.0.1:6379> hset userInfo userId 1001
(integer) 1
127.0.0.1:6379> hlen userInfo
(integer) 5
3) lists 列表类型(java-list集合)
使用场景: 存储各种列表。如:粉丝列表,主播列表,消息列表等等 常用命令: (lpush rpush lpop rpop llen lindex )
127.0.0.1:6379> lpush lista 11 22 33 44 aa bb cc dd
(integer) 8
127.0.0.1:6379> llen lista
(integer) 8
127.0.0.1:6379> rpush lista 111 222 333
(integer) 11
127.0.0.1:6379> lpush aaa bbb ccc
(integer) 2
127.0.0.1:6379> llen lista
(integer) 11
127.0.0.1:6379> lindex lista 0
"dd"
127.0.0.1:6379> lindex lista 1
"cc"
127.0.0.1:6379> lpush lista aaa bbb ccc
(integer) 14
127.0.0.1:6379> lindex lista 0
"ccc"
127.0.0.1:6379> lindex lista 13
"333"
127.0.0.1:6379> lpop lista
"ccc"
127.0.0.1:6379> lpop lista
"bbb"
127.0.0.1:6379> lpop lista
"aaa"
127.0.0.1:6379> llen lista
(integer) 11
127.0.0.1:6379> rpop lista
"333"
127.0.0.1:6379> rpop lista
"222"
127.0.0.1:6379> rpop lista
"111"
127.0.0.1:6379> llen lista
(integer) 8
127.0.0.1:6379> lpush listb a b c d e f
(integer) 6
127.0.0.1:6379> rpop listb
"a"
127.0.0.1:6379> rpop listb
"b"
127.0.0.1:6379> rpop listb
"c"
127.0.0.1:6379> rpop listb
"d"
127.0.0.1:6379> rpop listb
"e"
127.0.0.1:6379> rpop listb
"f"
4) sets 集合类型(java-set集合)
使用场景: 存储不重复元素,求多个集合交集。如:共同爱好,共同粉丝等等 常用命令: (sadd srem smembers sismember scard spop srandmember sinter sinterstore)
127.0.0.1:6379> sadd booka feihu xueshan lianchengjue tianlong shediao baima ludingji
(integer) 7
127.0.0.1:6379> sadd bookb feihu xueshan lianchengjue ludingji xiaoao shujian shendiao yitian
(integer) 8
127.0.0.1:6379> smembers booka
1) "lianchengjue"
2) "feihu"
3) "tianlong"
4) "baima"
5) "ludingji"
6) "xueshan"
7) "shediao"
127.0.0.1:6379> smembers bookb
1) "feihu"
2) "yitian"
3) "lianchengjue"
4) "ludingji"
5) "xiaoao"
6) "shendiao"
7) "xueshan"
8) "shujian"
127.0.0.1:6379> sismember booka feihu
(integer) 1
127.0.0.1:6379> sismember booka yitian
(integer) 0
127.0.0.1:6379> scard booka
(integer) 7
127.0.0.1:6379> scard bookb
(integer) 8
127.0.0.1:6379> srandmember booka
"baima"
127.0.0.1:6379> srandmember booka
"lianchengjue"
127.0.0.1:6379> srandmember booka
"baima"
127.0.0.1:6379> srandmember booka 3
1) "tianlong"
2) "ludingji"
3) "xueshan"
127.0.0.1:6379> srandmember booka 3
1) "feihu"
2) "baima"
3) "xueshan"
127.0.0.1:6379> srandmember booka 3
1) "lianchengjue"
2) "ludingji"
3) "shediao"
127.0.0.1:6379> scard booka
(integer) 7
127.0.0.1:6379> sinter booka bookb
1) "feihu"
2) "lianchengjue"
3) "ludingji"
4) "xueshan"
127.0.0.1:6379> sinterstore bookc booka bookb
(integer) 4
127.0.0.1:6379> smembers bookc
1) "feihu"
2) "xueshan"
3) "ludingji"
4) "lianchengjue"
127.0.0.1:6379> srem booka feihu lujingji
(integer) 1
127.0.0.1:6379> srem booka tianlong ludingji
(integer) 2
127.0.0.1:6379> scard booka
(integer) 4
127.0.0.1:6379> scard bookc
(integer) 4
127.0.0.1:6379> smembers booka
1) "baima"
2) "lianchengjue"
3) "xueshan"
4) "shediao"
127.0.0.1:6379> smembers bookc
1) "feihu"
2) "xueshan"
3) "ludingji"
4) "lianchengjue"
127.0.0.1:6379> spop bookb
"shendiao"
127.0.0.1:6379> smembers bookb
1) "feihu"
2) "yitian"
3) "lianchengjue"
4) "ludingji"
5) "xiaoao"
6) "xueshan"
7) "shujian"
127.0.0.1:6379> spop bookb
"xiaoao"
127.0.0.1:6379> smembers bookb
1) "feihu"
2) "yitian"
3) "lianchengjue"
4) "ludingji"
5) "xueshan"
6) "shujian"
127.0.0.1:6379> spop bookb 2
1) "lianchengjue"
2) "xueshan"
127.0.0.1:6379> smembers bookb
1) "feihu"
2) "yitian"
3) "ludingji"
4) "shujian"
127.0.0.1:6379> sadd booka feihu feihu feihu
(integer) 1
127.0.0.1:6379> smembers booka
1) "feihu"
2) "baima"
3) "lianchengjue"
4) "xueshan"
5) "shediao"
5)sorted sets 有序集合类型(java-set有序集合)
使用场景: 排行榜,弹幕消息,地理位置相关等等 常用命令: Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(scyore)却可以重复。 (zadd zrem zcard zcount zrangebyscore )
127.0.0.1:6379> zadd fans 11.1 zhaoyi 22.2 qianer 10.1 sunsan 33.3 lisi 22..4wuliu
(error) ERR syntax error
127.0.0.1:6379>
127.0.0.1:6379> zadd fans 11.1 zhaoyi 22.2 qianer 10.1 sunsan 33.3 lisi 22.2 zhouwu 55.5 wuliu 1.1 zhengqi
(integer) 7
127.0.0.1:6379> zadd fans 11.1 zhaoyi 22.2 qianer 10.1 sunsan 33.3 lisi 22.2 zhouwu 55.5 wuliu 1.1 zhengqi 66.6 zhaoyi
(integer) 0
127.0.0.1:6379> zadd fans 11.1 zhaoyi 22.2 qianer 10.1 sunsan 33.3 lisi 22.2 zhouwu 55.5 wuliu 1.1 zhengqi 66.6 wangba
(integer) 1
127.0.0.1:6379> zrangebyscore fans 0 70
1) "zhengqi"
2) "sunsan"
3) "zhaoyi"
4) "qianer"
5) "zhouwu"
6) "lisi"
7) "wuliu"
8) "wangba"
127.0.0.1:6379> zadd fans incr 1 zhaoyi
"12.1"
127.0.0.1:6379> zadd fans incr 1 zhaoyi
"13.1"
127.0.0.1:6379> zadd fans incr 1 zhaoyi
"14.1"
127.0.0.1:6379> zadd fans incr 60 zhaoyi
"74.099999999999994"
127.0.0.1:6379> zrangebyscore fans 0 70
1) "zhengqi"
2) "sunsan"
3) "qianer"
4) "zhouwu"
5) "lisi"
6) "wuliu"
7) "wangba"
127.0.0.1:6379> zrangebyscore fans 0 100
1) "zhengqi"
2) "sunsan"
3) "qianer"
4) "zhouwu"
5) "lisi"
6) "wuliu"
7) "wangba"
8) "zhaoyi"
127.0.0.1:6379> zcard fans
(integer) 8
127.0.0.1:6379> zrem fans zhengqi
(integer) 1
127.0.0.1:6379> zcard fans
(integer) 7
127.0.0.1:6379> zcount fans 0 30
(integer) 3
127.0.0.1:6379> zcount fans 30 100
(integer) 4
地理空间(geospatial)
添加4个城市: geoadd china 116.41667 39.91667 bj 121.43333 34.50000 sh 117.20000 39.13333 tj 113.65000 34.76667 zz 114.06667 22.61667 sz 返回两个城市的直线距离(默认单位为米,可以使用km) geodist china zz sz 返回113.65 34.76经纬度为中心,800公里之内的城市 georadius china 113.65 34.76 800 km 返回指定城市的经纬度 geopos china sz zz http://news.cntrades.com/show-186844.html
127.0.0.1:6379> geoadd china 116.41667 39.91667 bj 121.43333 34.50000 sh 117.20000 39.13333 tj 113.65000 34.76667 zz 114.06667 22.61667 sz
(integer) 5
127.0.0.1:6379> geodist china zz sz
"1352006.6461"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> geodist china zz sz km
"1352.0066"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> georadius china 113.65000 34.76667 800 km
1) "zz"
2) "sh"
3) "tj"
4) "bj"
127.0.0.1:6379> geodist china zz tj km
"579.0711"
127.0.0.1:6379> geodist china zz bj km
"622.7821"
127.0.0.1:6379> geodist china zz sh km
"712.7509"
127.0.0.1:6379> georadius china 113.65000 34.76667 700 km
1) "zz"
2) "tj"
3) "bj"
7 jedis API
jedis的简介
jedis 是redis java连接工具 ,引入jar包后,就可以使用java代码操作redis。
redis修改远程可以连接 vim /usr/redis/bin/redis.conf :69 bind 127.0.0.1 把当前redis实例和本机127.0.0.1进行绑定,只能本机客户端进行连接 如果想让其他任何机器进行访问该实例,需要把该实例与当前主机IP进行绑定 :69 bind 192.168.xxx.31 从新启动服务 /usr/redis/bin/redis-server /usr/redis/bin/redis.conf 使用客户端直接连接时出错 /usr/redis/bin/redis-cli 连接要换为连接IP地址: /usr/redis/bin/redis-cli -h 192.168.170.31
创建项目引入jar,编写代码
<!-- jedis包 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.2</version>
</dependency>
具体代码:
package com.aaa.jedis.demo;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class ConncetRedisTest {
public static void main(String[] args) {
//查看源码,会看到使用host和port的构造
Jedis jedis =new Jedis("192.168.170.31",6379);
//测试是否可以联通
String pingResult = jedis.ping();
System.out.println("是否通:"+pingResult);
if(!"PONG".equals(pingResult)){
System.out.println("连不通");
return;
}
System.out.println("连通");
//查询
Set<String> keyList = jedis.keys("*");
System.out.println("已经存储的key为:");
for (String key : keyList) {
System.out.println(key);
}
System.out.println("------------------------------");
//进行字符串操作
jedis.set("aaa", "111");
String aaa = jedis.get("aaa");
System.out.println(aaa);
//进行hash操作
//进行list操作
//....
}
}
其他操作:
//字符串 string
jedis.set("aaa", "111");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: "+ jedis.get("aaa"));
在虚拟机里面测试,客户端链接
./redis-cli -h 192.168.182.20
//散列 hashmap
Map<String, String> map = new HashMap();
map.put("userName", "scott");
map.put("password", "tiger");
map.put("age", "100");
// 将map存入redis中
jedis.hmset("mapa", map);
// 取出redis中的map进行遍历
Map<String, String> userMap = jedis.hgetAll("mapa");
for (Map.Entry<String, String> item : userMap.entrySet()) {
System.out.println(item.getKey() + " : " + item.getValue());
}
// 列表 list
jedis.lpush("lista", "111");
jedis.lpush("lista", "222");
jedis.lpush("lista", "333");
// 获取存储的数据并输出
List<String> list = jedis.lrange("lista", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
// 集合 set
jedis.sadd("course","java","c","c#","java","python");
// 自动去重
System.out.println(jedis.smembers("course"));
//有序集合 sorted set
Map<String,Double> map1 = new HashMap<>();
map1.put("python",2.0);
map1.put("java",1.0);
map1.put("bigdata",3.0);
map1.put("AI",4.0);
jedis.zadd("mysort", map1);
//正序排列
Set<String> mysort = jedis.zrange("mysort",0,-1);
System.out.println(mysort);
//Keys 实例
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
|