redis常用命令 5种数据类型及作用场景 jedis API 【redis】

导读:本篇文章讲解 redis常用命令 5种数据类型及作用场景 jedis API 【redis】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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语言编写。
特点:

  1. 速度快
    基于内存读写,读写速度非常快,读一秒能达到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);
        }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75452.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!