Redis学习记录--Mac平台

NoSQL数据库: 不仅仅是SQL,泛指非关系型数据库

 · 不遵循SQL标准
 · 不支持ACID
 · 远超SQL的性能

适用场景:
 · 对数据高并发的读写
 · 海量数据的读写
 · 对数据高可扩展性的

Mac中安装Redis

brew install redis

//方式一:使用brew帮助我们启动软件
brew services start redis
//方式二
redis-server /usr/local/etc/redis.conf

//执行以下命令
redis-server

redis默认端口号6379,默认auth为空,输入以下命令即可连接

redis-cli -h 127.0.0.1 -p 6379

//关闭redis服务 
redis-cli shutdown

//强行终止redis
sudo pkill redis-server

设置后台启动:

sudo vim /usr/local/etc/redis.conf

搜索文件找到:daemonize no这一行,修改为:daemonize yes

请添加图片描述
启动redis并查看启动进程

#后台方式启动
redis-server /System/Volumes/Data/opt/homebrew/etc/redis.conf
查看启动进程
ps aux | grep redis

进入客户端调用

redis-cli

数据类型

Key值的操作:

  • keys * 查看当前库所有key
  • ==set key value ==设置key值与value
  • exists key 判断key是否存在
  • type key 查看key是什么类型
  • del key 删除指定的key数据
  • unlink key 根据value选择非阻塞删除 --仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
  • expire key 10 10秒钟:为给定的key设置过期时间
  • ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
库的选择:

select 命令切换数据库
dbsize 查看当前数据库的key数量
flushdb 清空当前库
flushall 通杀全部库

string字符串

一个key对应一个value
二进制安全的,即可包含任何数据
value最多可以是512m
参数设置:
set key value 设置key值
get key 查询key值
append key value 将给定的value追加到原值末尾
strlen key 获取值的长度
setnx key value 只有在key不存在的时候,设置key值
incr key 将key值存储的数字增1,只对数字值操作,如果为空,新增值为1
decr key 将key值存储的数字减1,只对数字值操作,如果为空,新增值为1
decr key 将key值存储的数字减1
incrby/decrby key <步长> 将key值存储的数字增减如步长

原子性,有一个失败则都失败.单线程不会被打断,多线程很难说,被打断的就不是原子操作

补充额外的字符串参数:

mset key value key value..同时设置一个或者多个key-value
mget key key...同时获取一个或多个value
msetnx key value key value..同时设置一个或者多个key-value.当且仅当所有给定key都不存在
getrange key <起始位置> <结束位置> 获取key的起始位置和结束位置的值
setrange key <起始位置> value 将value的值覆盖起始位置开始
setex key <> value 设置键值的同时,设置过期时间
getset key value 用新值换旧值
list 列表

常用命令:

lpush/rpush key value value...从左或者右插入一个或者多个值(头插与尾插)

lpop/rpop key 从左或者右吐出一个或者多个值(值在键在,值都没,键都没)

rpoplpush key1 key2 从key1列表右边吐出一个值,插入到key2的左边

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

lrange key 0 -1 获取所有值

lindex key index 按照索引下标获得元素

llen key 获取列表长度

linsert key before/after value newvalue 在value的前面插入一个新值

lrem key n value 从左边删除n个value值

lset key index value 在列表key中的下标index中修改值value
Set集合

字典,哈希表;自动排重且为无序的
常用命令:

sadd key value value... 将一个或者多个member元素加入集合key中,已经存在的member元素被忽略
smembers key 取出该集合的所有值
sismember key value 判断该集合key是否含有改值
scard key 返回该集合的元素个数
srem key value value 删除集合中的某个元素
spop key 随机从集合中取出一个元素
srandmember key n 随即从该集合中取出n个值,不会从集合中删除
smove <一个集合a><一个集合b>value 将一个集合a的某个value移动到另一个集合b
sinter key1 key2 返回两个集合的交集元素
sunion key1 key2 返回两个集合的并集元素
sdiff key1 key2 返回两个集合的差集元素(key1有的,key2没有)
hash哈希

键值对集合,特别适合用于存储对象类型
常用命令:

hset key field value 给key集合中的filed键赋值value
hget key1 field 集合field取出value
hmset key1 field1 value1 field2 value2 批量设置hash的值
hexists key1 field 查看哈希表key中,给定域field是否存在
hkeys key 列出该hash集合的所有field
hvals key 列出该hash集合的所有value
hincrby key field increment 为哈希表key中的域field的值加上增量1 -1
hsetnx key field value 将哈希表key中的域field的值设置为value,当且仅当域field不存在
note
	Hash类型对应的数据结构是两种: Ziplist(压缩列表),hashtable(哈希表). 当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable.

Zset有序集合

没有重复元素的字符串集合,按照相关的分数进行排名,排名从低到高,排名可重复
有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合
常用命令:

zadd key score1 value1 score2 value2 将一个或多个member元素及其score值加入到有序key中
zrange key start stop (withscores) 返回有序集key,下标在start与stop之间的元素,带withscores,可以让分数一起和值返回到结果集。
zrangebyscore key min max(withscores) 返回有序集key,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score的值递增次序排列
zrevrangebyscore key max min (withscores)同上,改为从大到小排列
zincrby key increment value 为元素的score加上增量
zrem key value 删除该集合下,指定值的元素
zcount key min max 统计该集合,分数区间内的元素个数
zrank key value 返回该值在集合中的排名,从0开始

配置文件详解

#bind 127.0.0.1 -::1 //给本地远程注释,可以远程
protected-mode no //保护模式改为no,可以远程访问
daemonize yes //后台启动为yes
pidfile /var/run/redis_6379.pid //保存进程号的路径

在这里插入图片描述

发布和订阅 : 发布者(pub)发送消息,订阅者(sub)接收消息

Redis客户端可以订阅任意数量的频道

订阅频道:subscribe channell
发送信息: publish channell dasd

Redis新数据类型

Bitmaps : 位示图 010101—存取
1.合理使用操作位可以有效地提高内存使用率和开发使用率
2.本身是一个字符串,不是数据类型,数组的每个单元只能存放0和1,数组的下标在Bitmaps叫做偏移量
3.节省空间,一般存储活跃用户比较多

命令参数:

setbit key offset value  创建位示图
第一次初始化bitmaps,如果偏移量比较大,那么整个初始化过程执行会比较慢,还可能会造成redis的堵塞

通用命令:

getbit key offset ; getbit取值 获取bitmaps中某个偏移量的值、获取键的第offset位的值
bitcount key (start end); 统计数值 统计字符串从start 到end字节比特值为1的数量
bitop and(or/not/xor)destkey key ; 复合操作,交并非异或,结果保存在destkey、这个key放两个key1 key2

redis的setbit设置或清除的是bit位置,而bitcount计算的是byte的位置请添加图片描述
应用场景:如存储用户访问量,每个用户占1bit,极大访问量时可以节省空间

HyperLogLog

1.统计网页中页面访问量
2.只会根据输入元素来计算基数,而不会储存输入元素本身,不能像集合那样,返回输入的各个元素
3.基数估计是在误差可接受的范围内,快速计算(不重复元素的结算)

命令参数:

pfadd key element   添加指定的元素到hyperloglog中
pfcount key  计算key的近似基数,即这个key的键位添加了多少个不重复元素
pfmerge destkey sourcekey sourcekey 一个或多个key合并后的结果存在另一个key
Geographic

提供经纬度设置,查询范围,距离查询等
命令参数:

1.添加地理位置(经度纬度名称):当坐标超出指定的范围,命令会返回一个错误、已经添加的数据,无法再添加
geoadd key longitude latitude member
2.获取指定地区的坐标值
geopos key member 
3.获取两个位置之间的直线距离
geodist key member1 member2 (m km ft mi)
4.以给定的经纬度为中心,找出某一半径的内元素
georadius key longitude latitude radius (m km ft mi)

Jedis操作Redis – java来操作Redis

在xml中配置

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.6.1</version>
        </dependency>
    </dependencies>

在类中定义

/**
 * @author cVzhanshi
 * @create 2021-07-28 9:13
 */
public class JedisDemo1 {
   
    public static void main(String[] args) {
   
        //创建Jedis对象
        Jedis jedis = new Jedis("192.168.242.110", 6379);
        //测试
        String ping = jedis.ping();
        System.out.println(ping);
    }
}

如果报错,原因为

防火墙要关闭,systemctl stop/disable firewalld.service
设置可远程访问,注释掉bind,#bind 127.0.0.1 -::1 ,可远程访问
设置保护模式为no,protected-mode no
在上面的配置文件中有提及

请添加图片描述
或者这样测试

public class JedisDemo1 {
   
    public static void main(String[] args) {
   
        Jedis jedis = new Jedis("192.168.242.110", 6379);
        System.out.println(jedis.getClient().getPort());
        System.out.println("连接本地的Redis服务器成功");
        //查看服务是否运行
        System.out.println("服务正在运行:" + jedis.ping());

    }
}

配合上面的数据类型,添加数据的代码演示

Jedis jedis = new Jedis("127.0.0.1", 6379);
        Set<String> keys = jedis.keys("*");
        for(String key:keys){
   
            System.out.println("key");
        }
类型操作

key的测试代码如下

jedis.set("k1", "v1");
jedis.set("k2", "v2");
jedis.set("k3", "v3");
Set<String> keys = jedis.keys("*");
System.out.println(keys.size());
for (String key : keys) {
   
System.out.println(key);
}
System.out.println(jedis.exists("k1"));
System.out.println(jedis.ttl("k1"));                
System.out.println(jedis.get("k1"));

String测试代码

jedis.mset("str1","v1","str2","v2","str3","v3");
System.out.println(jedis.mget("str1","str2","str3"));
/*
或者通过如下代码测试:
mset可以添加多个key-value
mget则是取出相对应多个key
*/
//操作key string
@Test
public void demo1() {
   
    //创建Jedis对象
    Jedis jedis = new Jedis("172.22.109.205",6379);

    //添加
    jedis.set("name","lucy");

    //获取
    String name = jedis.get("name");
    System.out.println(name);

    //设置多个key-value
    jedis.mset("k1","v1","k2","v2");
    List<String> mget = jedis.mget("k1", "k2");
    System.out.println(mget);

    Set<String> keys = jedis.keys("*");
    for(String key : keys) {
   
        System.out.println(key);
    }
    jedis.close();
}

List测试代码

List<String> list = jedis.lrange("mylist",0,-1);
for (String element : list) {
   
System.out.println(element);
}
/*
通过lpush放到左边
lrange取出全部
输出的时候都是从右边到左边
*/
//操作list
@Test
public void demo2() {
   
    //创建Jedis对象
    Jedis jedis = new Jedis("172.22.109.205",6379);

    jedis.lpush("key1","lucy","mary","jack");
    List<String> values = jedis.lrange("key1", 0, -1);
    System.out.println(values);
    jedis.close();
}

Set测试代码

jedis.sadd("orders", "order01");
jedis.sadd("orders", "order02");
jedis.sadd("orders", "order03");
jedis.sadd("orders", "order04");
Set<String> smembers = jedis.smembers("orders");
for (String order : smembers) {
   
System.out.println(order);
}
jedis.srem("orders", "order02");

/*
key可以对应多个value
sadd添加多个key-value
smembers输出多个value
srem则是删除
*/
//操作set
@Test
public void demo3() {
   
    //创建Jedis对象
    Jedis jedis = new Jedis("172.22.109.205",6379);

    jedis.sadd("names","lucy");
    jedis.sadd("names","mary");

    Set<String> names = jedis.smembers("names");
    System.out.println(names);
    jedis.close();
}

Hash测试代码

jedis.hset("hash1","userName","lisi");
System.out.println(jedis.hget("hash1","userName"));
Map<String,String> map = new HashMap<String,String>();
map.put("telphone","13810169999");
map.put("address","atguigu");
map.put("email","[email protected]");
jedis.hmset("hash2",map);
List<String> result = jedis.hmget("hash2", "telphone","email");
for (String element : result) {
   
System.out.println(element);
}
//操作hash
@Test
public 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值