当前位置:首页 » 网络管理 » 如何删除哈希表中的一个元素
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

如何删除哈希表中的一个元素

发布时间: 2022-10-23 13:21:37

‘壹’ redis中list和hash的基本命令和使用场景

 Redis的数据类型

Redis的数据类型共有五种:string,list,hash,set,zset;

String 字符串相对来说做平常,key-value,类似是hashmap的用法;

List 队列,可以双向的存值,设计时,也可以简单用来当队列模式;

Hash 字典,一个key 对应多个值;

Set 无序的集合;

Zset 有序的集合;

列表 list

Redis列表是简单的字符串行表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

列表 list—— 基本命令

lpush

语法:lpush key value [value„]

作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到表头

返回值:数字,新列表的长度

rpush

语法:rpush key value [value„]

作用:将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右 的顺序依次插入到表尾

返回值:数字,新列表的长度

lrange

语法:lrange key start stop

作用:获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,以 1 表示列表的第二个元素;

start ,

stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒 数第二个元素,以此类推。

start ,stop 超出列表的范围不会出现错误。

返回值:指定区间的列表

lindex

语法:lindex key index

作用:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。

0 表示列表的第一个元素,以 1 表示列表的第二个元素;

start ,

stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

返回值:指定下标的元素;index 不在列表范围,返回nil

llen

语法:llen key

作用:获取列表 key 的长度 返回值:数值,列表的长度; key 不存在返回0

lrem

语法:lrem key count value

作用:根据参数count的值,移除列表中与参数value相等的元素,

count>0,从列表的左侧向右开始移 除;

count<0从列表的尾部开始移除;

count=0 移除表中所有与value相等的值。

返回值:数值,移除的元素个数

lset

语法:lset key index value

作用:将列表 key 下标为 index 的元素的值设置为 value。

返回值:设置成功返回 ok ; key 不存在或者 index 超出范围返回错误信息

linsert

语法:linsert key BEFORE(前)|AFTER(后) pivot value

作用:

将值value插入到列表key当中位于值pivot之前或之后的位置。

key不存在,pivot不在列表中, 不执行任何操作。

返回值:命令执行成功,返回新列表的长度。没有找到 pivot 返回 -1, key 不存在返回 0。

RPOP key

移除列表的最后一个元素,返回值为移除的元素。

RPOPLPUSH source destination

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

LPOP key

移除列表的第一个元素,返回值为移除的元素。

使用场景

1. 消息队列

队列模式的情况下,可以使用,左进右出的原则,但不建议使用,因为现在市面上有很多成熟的消息中间件,没有必要造轮子;

2.排行榜

某一段时间统计数据的排行榜可以放在list里面,需要分页的话,也可以使用lrange start stop实现;

3. list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现

哈希类型hash

redis hash是一个 string 类型的 field 和 value 的映射表,hash特别适合用于存储对象,每个 hash 可以存储 232 - 1键值对(40多亿);

哈希类型 hash—— 基本命令

hset /hget /hmset /hmget /hgetall /hkeys /hvals /hexists

hset

语法:hset hash 表的key field value

作用:将哈希表 key 中的域 field 的值设为value ,如果 key 不存在,则新建 hash 表,执行赋值,如果有 field ,则覆盖值。

返回值: ①如果 field 是 hash 表中新field,且设置值成功,返回 1 ②如果 field 已经存在,旧值覆盖新值,返回0

hget

语法:hget key field

作用:获取哈希表 key 中给定域 field 的值

返回值:field 域的值,如果 key 不存在或者 field 不存在返回nil

hmset

语法:hmset key field value [field value„]

说明:同时将多个field-value(域-值)设置到哈希表key中,此命令会覆盖已经存在的field, hash表key不存在,创建空的hash表,执行hmset.

返回值:设置成功返回ok, 如果失败返回一个错误

hmget

语法:hmget key field [field„]

作用:获取哈希表key中一个或多个给定域的值

返回值:返回和field顺序对应的值,如果field不存在,返回nil

hgetall

语法:hgetall key

作用:获取哈希表key中所有的域和值

返回值:以列表形式返回hash中域和域的值 ,key不存在,返回空hash

hdel

语法:hdel key field [field„]

作用:删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略

返回值:成功删除的 field 的数量

hkeys

语法:hkeys key

作用:查看哈希表 key 中的所有 field 域

返回值:包含所有 field 的列表,key 不存在返回空列表

hvals

语法:hvals key

作用:返回哈希表中所有域的值 返回值:包含哈希表所有域值的列表,key 不存在返回空列表

hexists

语法:hexists key field

作用:查看哈希表 key 中,给定域 field 是否存在

返回值:如果 field 存在,返回 1, 其他返回0

使用场景

1、购物车

以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素,如下图所示。

2、hash还是比较适合存储对象(key field value)或者是字典表(type,key,vlaue),刚好符合对象的要素,但string + json也可以存储,两则比较有什么区别?

 String  + json    Hash

效率很  高           高

容量      低           低

灵活性  低           高

序列化  简单       复杂

‘贰’ c语言中哈希表删除数据怎么处理

链地址直接删除结点,开地址将那个位置置一个删除标记

‘叁’ 哈希表 c++ 删除

typedef struct //定义哈希表的结构
{int elem[MAXSIZE]; //数据元素体
HAVEORNOT elemflag[MAXSIZE]; //元素状态标志,没有记录、有记录、有过记录但已被删除
int count; //哈希表中当前元素的个数
}HashTable;

BOOL DeleteHash(HashTable &H,Record e)
{//在查找成功时删除待删元素e,并返回True,否则返回False
int p;
if(!SearchHash(H,e.keynum,p)) //表中不存在待删元素
return False;
else
{H.elemflag[p]=DELKEY; //设置标志为DELKEY,表明该元素已被删除
H.count--; //哈希表当前长度减一
return True;
}
}

BOOL SearchHash(HashTable H,int k,int &p)
{//在开放寻址哈希表H中查找关键字为k的数据元素,若查找成功,以p指示
//待查数据元素在表中的位置,并返回True;否则,以p指示插入位置,并
//返回False
int p1;
p1=p=Hash(k); //求得哈希地址
while(H.elemflag[p]==HAVEKEY&&k!=H.elem[p])
//该位置中填有记录并且关键字不相等
{p++; //冲突处理方法:线性探测再散列
if(p>=MAXSIZE) p=p%MAXSIZE; //循环搜索
if(p==p1) return False; //整个表已搜索完,没有找到待查元素
}
if(k==H.elem[p]&&H.elemflag[p]==HAVEKEY) //查找成功,p指示待查元素位置
return True;
else return False; //查找不成功
}

‘肆’ 用语言简要描述hash表的查找插入删除某个元素

hash表的每个位置都会预留空间(即使没有元素),插入/删除直接就是把元素放在相应位置/从相应位置移除。

‘伍’ java HashSet 删除元素问题

s.remove(i-1);
改为
s.remove((short)(i-1));
i-1是int型,要转成short

‘陆’ 怎么删除HashMap的一个键值

取所有的键:
HashMap hm = new HashMap();
hm.put("A_thlsd,,", "01");
hm.put("b_adhd", "02");
hm.put("c_decteln", "03");
hm.put("d_apple", "04");
hm.put("e_blue", "05");
hm.put("ff_drag", "06");
hm.put("g_cellention", "07");
Set set = hm.keySet();

Object[] obj=set.toArray();
Arrays.sort(obj);
for(int i=0;i<obj.length;i++){
System.out.println(obj[i]);
}

取所有的键值:

HashMap hm = new HashMap();
hm.put("A_thlsd,,", "01");
hm.put("b_adhd", "02");
hm.put("c_decteln", "03");
hm.put("d_apple", "04");
hm.put("e_blue", "05");
hm.put("ff_drag", "06");
hm.put("g_cellention", "07");
Set set = hm.entrySet();

Object[] obj=set.toArray();
//Arrays.sort(obj);
for(int i=0;i<obj.length;i++){
System.out.println(obj[i]);
}
这个方法不好

【xiyao】:
1.
Set set = map.keySet();
Iterator it = set.iterator();
if(it.hasNext()){
Object j = it.next();
System.out.println(j);
System.out.println(map.get(j)) ;
}
2.
Set set = map.entrySet();
Iterator it = set.iterator();
if(it.hasNext()){
Map.Entry me = (Map.Entry) it.next();
System.out.println(me.getKey());
System.out.println(me.getValue());
}

【xiyao】:
哦 晕了 IF换WHILE

【weiqiyiji】:
Set set = map.entrySet();
Iterator it = set.iterator();
if(it.hasNext()){
Map.Entry me = (Map.Entry) it.next();
System.out.println(me.getKey()+"="+me.getValue());

‘柒’ HashMap怎么删除数据

package love.fs;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;public class HashMapTest { public static void main(String args[]) { HashMap hm = new HashMap(); hm.put("a", 2); hm.put("aa", 22); hm.put("aaa", 222); hm.put("aaaa", 222); hm.put("b", 3); hm.put("bb", 33); hm.put("bbb", 333); hm.put("bbbb", 3333); Iterator<?> it = hm.entrySet().iterator(); System.out.println("这里的内容是关于HashMap的遍历,可见并不是有序存储的"); while(it.hasNext()) { Map.Entry me = (Map.Entry)it.next(); System.out.print(me.getKey() + ": "); System.out.println(me.getValue()); } System.out.println("下面进行对HashMap的删除"); Iterator<?> it1 = hm.entrySet().iterator(); while(it.hasNext()) { Map.Entry me = (Map.Entry)it.next(); System.out.println(me.getKey()+":"); if(me.getKey().equals("aa")) { System.out.println("已找到值"); { hm.remove(me.getKey()); } } } }}这就是所有代码了,呵呵,希望能找到问题所在,哈哈

‘捌’ 怎么删除hash

你是想删除整个key吧,而不是某个key里边的单个或多个域,删除整个key可以用del key这个命令,如果是在程序里写的话就用$redis->del($key); 希望能帮到你